对于GCC 32位,-1>> 1让我回到FFFFFFFF,但我想在2的补码后,我会得到 0111 1111 ... 1111应该是7fff ffff。我错过了什么?
答案 0 :(得分:10)
在大多数实现中,该运算符为签名类型执行arithmetic shift
,因此它保留sign
位(最左边的位),在本例中为{{ 1}}。
正如@Clifford正确指出的那样,语言标准将1
的实现留给了实现者。
有关详细信息,请参阅Wikipedia article。
答案 1 :(得分:2)
对于E1 >> E2
,如果E1
为负,则行为是实现定义的,这意味着不同的编译器可以使用不同的策略来实现它。
显然GCC选择算术移位,正如@ merlin2011
所指出的那样