【发布时间】:2016-10-30 20:30:41
【问题描述】:
我有这段简单的代码。
谁能解释为什么输出是ffff 而不是0fff??
#include<stdio.h>
int main(){
printf("\n%x",(-1>>4));
return 1;
}
【问题讨论】:
标签: c bitwise-operators
我有这段简单的代码。
谁能解释为什么输出是ffff 而不是0fff??
#include<stdio.h>
int main(){
printf("\n%x",(-1>>4));
return 1;
}
【问题讨论】:
标签: c bitwise-operators
最好避免移动负数。对于<<,这是未定义的行为。对于>>,它是实现定义的:
E1 >> E2的结果是E1右移了E2位位置。如果E1具有无符号类型 或者如果E1具有带符号类型和非负值,则结果的值是整数E1 / 2E2商的一部分。 如果E1具有带符号类型和负值,则 结果值是实现定义的。
【讨论】:
0 位。
右移用符号位填充空位。也就是说,如果数字为正,则填充为 0,如果为负,则填充为 1。
-1 = ffff = 11111111
如果你把它移到右边,得到的数字将是一样的。
如果您不明白为什么 -1 = ffff,请阅读二进制补码,这是大多数语言使用的有符号整数的表示。
【讨论】: