让整数 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)
答案 0 :(得分:7)
负值的右移是实现定义的,[expr.shift] / 3
E1 >> E2
的值为E1
右移E2
位位置。 [..]。 如果E1
具有签名类型和负值,则生成 值是实现定义的。
大多数实现使用所谓的arithmetic shift,保留并扩展符号位:
通过二进制补码二进制数上的 n 位向右移位 具有除以 2 n 的效果,但它总是向下舍入 (朝负无穷大)。这与舍入方式不同 通常在有符号整数除法中完成(向0舍入)。 这种差异导致了多个编译器中的错误。
所以,当缩短到8位时,会发生以下情况。在二进制中,-5将是
1111 1011
算术右移后:
1111 1101
现在翻转并添加一个以获得正值进行比较:
0000 0011
对我来说看起来像是三个。