位操作 - 负数

Sea*_*hot 2 c++ bit-manipulation

令整数i = -5的大小为2个字节.的符号位在最左边的比特值是"1"(这表示它是一个负数).当我试图进行右移操作时,我不应该期望第15位的'1'转移到第14位吗?并给我一个高但积极的价值?

我尝试了什么:

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

int i=-5
i>>1 // giving me -3 (mind=blown)
Run Code Online (Sandbox Code Playgroud)

Col*_*mbo 7

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

E1 >> E2E1右移位E2位置.[..].如果E1具有有符号类型和负值,则结果值是实现定义的.

大多数实现都使用所谓的算术移位,它保留并扩展了符号位:

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

那么,当缩短到8位时,会发生以下情况.在二的补码-5将是

1111 1011
Run Code Online (Sandbox Code Playgroud)

算术右移后:

1111 1101
Run Code Online (Sandbox Code Playgroud)

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

0000 0011 
Run Code Online (Sandbox Code Playgroud)

对我来说看起来像三个.