C++ 位操作-用于负数

C++ 位操作-用于负数,c++,bit-manipulation,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) 负值的右移是实现定义的,[expr.shift]/3 E1>>E2的值是E1右移的E2位位置。 [..].

让整数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)

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

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

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

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

因此,当缩短到8位时,会发生以下情况。在二的补语中-5是

1111 1011
算术右移后:

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

0000 0011 

在我看来像是三个。

我正在研究你的解决方案。所以我是如何理解的。如果我们必须右移一个负数,我将继续。如果我们必须右移一个数字-x。1.为x写入二进制文件。2.转换成2的补码。3.右移(“最左边的1”是粘性的)。4.重新计算2的补码。这是一个带“-”符号的答案。这有意义吗?@SeasonalShot。。除以2^n怎么样?不,你的方法不是完全正确的(特别是,如果数字是-x,那么你写的是-x的二进制表示,而不是x)。那么你已经有了2的补码表示,这是数字本身,而不是它的一些变换。这只是表达同样事物的另一种方式。