int16_t a = -1;
a >>= 2;
a的价值是什么, 答案是-1还是0,你能解释一下原因吗?
是否进行了整数除法,然后使用了floor函数,或者只是简单地将2s中的所有1都移位到右边,从而导致仍然为-1或者截断除法导致0。
答案 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
。这是大多数编译器所发生的。但答案取决于编译器的实现