我收到了以下代码:
int main(int argc, char *argv[])
{
char c = 128;
c = c >> 1;
printf("c = %d\n", c);
return 0;
}
在win xp 32位上运行上面的代码,我得到了结果:-64
。为什么-64
?
答案 0 :(得分:9)
因为char
类型是带符号的8位整数(在您正在使用的C的实现中)。如果您尝试将值128存储在其中,它实际上将是-128。
这个位将是:
10000000
移动负数将保持符号位设置(因为您的实现使用算术移位):
11000000
结果是-64。
答案 1 :(得分:3)
C标准未指定char是有符号还是无符号。在这种情况下,它看起来像是一个签名的char,范围从-128到+127。为它分配128会滚动并离开-128,因此c>> 1是-64。
如果您将c指定为“unsigned char”,则c>> 1将为64。
正如评论所说,标准未定义右移一个负值,所以它只是运气,它是-64。
答案 2 :(得分:0)
变量c
已签名。将声明更改为unsigned char c
...将产生64的结果
答案 3 :(得分:0)
您使用的是默认情况下已签名的char
类型。签名char
的范围是-128到127.这意味着char c = 128确实将c
设置为-128。 (这是因为大多数处理器使用两个补码来表示负数)因此当你向右移动时你得到-64。
最重要的是,在进行位操作时,使用无符号类型来获得预期的结果。