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

时间:2019-02-10 18:06:32

标签: c shift

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

unsigned char p = 170;
p = (~p) >> 4 & 255;

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

首先(〜p)将应用使10101010变为01010101

这是一个正数,所以>> 4在我的理解中将导致00000101。

但是似乎是11110101,我不明白为什么。以我的理解,向右移动一个正数将插入0而不是1。

1 个答案:

答案 0 :(得分:7)

在表达式中使用时,通常将小于int的整数转换为int。因此,以int中的16位(~p) >> 4 & 255为例:

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