位操作 - 负数

时间:2015-01-15 00:09:13

标签: c++ bit-manipulation

让整数 i = -5 的大小为2个字节。最左边的位的有符号位值为' 1'(表示它是负数)。 当我试图进行右移操作时,我是不是应该期待' 1'在第15位位置转移到第14位?并给我一个很高但正面的价值?

我尝试了什么:

int i=5;
i>>1 // giving me 2 (i understand this)

int i=-5
i>>1 // giving me -3 (mind=blown)

1 个答案:

答案 0 :(得分:7)

负值的右移是实现定义的,[expr.shift] / 3

  

E1 >> E2的值为E1右移E2位位置。   [..]。 如果E1具有签名类型和负值,则生成   值是实现定义的。

大多数实现使用所谓的arithmetic shift保留并扩展符号位

  

通过二进制补码二进制数上的 n 位向右移位   具有除以 2 n 的效果,但它总是向下舍入   (朝负无穷大)。这与舍入方式不同   通常在有符号整数除法中完成(向0舍入)。   这种差异导致了多个编译器中的错误。

所以,当缩短到8位时,会发生以下情况。在二进制中,-5将是

1111 1011

算术右移后:

1111 1101

现在翻转并添加一个以获得正值进行比较:

0000 0011 

对我来说看起来像是三个。