C程序按位:值-1>> 1

时间:2014-04-21 08:10:53

标签: c bit-manipulation

对于GCC 32位,-1>> 1让我回到FFFFFFFF,但我想在2的补码后,我会得到 0111 1111 ... 1111应该是7fff ffff。我错过了什么?

2 个答案:

答案 0 :(得分:10)

大多数实现中,该运算符为签名类型执行arithmetic shift,因此它保留sign位(最左边的位),在本例中为{{ 1}}。

正如@Clifford正确指出的那样,语言标准将1的实现留给了实现者。

有关详细信息,请参阅Wikipedia article

答案 1 :(得分:2)

对于E1 >> E2,如果E1为负,则行为是实现定义的,这意味着不同的编译器可以使用不同的策略来实现它。

显然GCC选择算术移位,正如@ merlin2011

所指出的那样