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)
负值的右移是实现定义的,[expr.shift]/3
值
E1 >> E2是E1右移位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)
对我来说看起来像三个.
| 归档时间: |
|
| 查看次数: |
1133 次 |
| 最近记录: |