我得到了以下的代码:
int main(int argc, char *argv[])
{
char c = 128;
c = c >> 1;
printf("c = %d\n", c);
return 0;
}
在32位Windows XP上运行上述代码,我得到了结果:
-64
。为什么会是-64
呢?我得到了以下的代码:
int main(int argc, char *argv[])
{
char c = 128;
c = c >> 1;
printf("c = %d\n", c);
return 0;
}
-64
。为什么会是-64
呢?char
类型在你使用的C实现中是有符号的8位整数。如果你试图将值128存储在其中,它实际上会变成-128。10000000
负数进行位移操作时,符号位会被保留(因为你的实现采用了算术位移):
11000000
char
是有符号的。此外,你应该澄清标准没有为右移负值指定任何特定行为。 - Oliver Charlesworth变量c
是有符号的。将声明更改为unsigned char c
...将得到一个结果为64。
您正在使用默认为有符号的类型char
。有符号的char
范围为-128到127,这意味着char c = 128实际上将c
设置为-128。(这是因为大多数处理器使用二进制补码表示负数)因此,当您向右移位时,您会得到-64。
底线是,在进行位操作时,请使用无符号类型以获得您期望的结果。
char c = 128;
后面添加一行printf("before shift c = %d\n", c);
。 - Raymond Chen