c中的位移位为负值

时间:2015-06-21 11:01:28

标签: c bit-manipulation

int16_t a = -1;
a >>= 2;

a的价值是什么, 答案是-1还是0,你能解释一下原因吗?

是否进行了整数除法,然后使用了floor函数,或者只是简单地将2s中的所有1都移位到右边,从而导致仍然为-1或者截断除法导致0。

2 个答案:

答案 0 :(得分:4)

对于C语言草案6.5.7按位移位运算符5:

  

E1>的结果> E2是E1右移E2位位置。如果E1有   无符号类型或E1具有带符号类型和非负值,   结果的值是E1 /的商的不可分割的一部分   2 E2 。如果E1有签名类型和负值,则   结果值是实现定义的

这意味着它是正确的未定义行为,但每个编译器可能决定用1或0填充位。

结果可以是-1(填充1位)或16383 = 0x3FFF(0位)

答案 1 :(得分:0)

当我们进行右移时,符号位对于有符号数据类型保持不变,因此如果等于-1 ,即,则数据的所有位都为1。如果我们无论多少位都进行右移,数据的值保持不变。所以a的值仍然是-1。这是大多数编译器所发生的。但答案取决于编译器的实现