有人可以解释我在C中右移的行为吗?

1 c shift

我不明白以下代码的结果:

unsigned char p = 170;
p = (~p) >> 4 & 255;
Run Code Online (Sandbox Code Playgroud)

结果是:245我不明白为什么.

首先,(~p)将应用10101010到01010101的原因

这是一个正数,因此>> 4将导致00000101在我的理解中.

但它似乎是11110101,我不明白为什么.根据我的理解,将正数向右移动将插入0而不是1.

Eri*_*hil 6

当在表达式中使用时,比int通常转换为的整数窄int.因此,使用16位int进行说明,在(~p) >> 4 & 255:

  • p是10101010 2.
  • 这将转换为a int,生成0000000010101010 2.
  • ~p生产1111111101010101 2.
  • (~p) >> 4可能会产生1111111111110101 2.(负值的右移是实现定义的.)
  • (~p) >> 4 & 255产生11110101 2.
  • 11110101 2是245.