为什么(〜10)在C ++(按位运算符)中等于-11

时间:2018-07-15 18:52:47

标签: c++ bit-manipulation

我正在学习C ++,想知道为什么会这样。

我知道第一位处理该值是否为负。

但是,如果您有0 1 0 1 0并执行〜,您将得到1 0 1 0 1对吗?

请有人帮我解决这个问题。谢谢!

2 个答案:

答案 0 :(得分:1)

  

但是,如果您有0 1 0 1 0并执行〜,您将得到1 0 1 0 1对吗?

如果仅查看这5位,那是正确的。如果int用32位表示,则还有27个您尚未考虑的位。左边有27个零位来表示数字10。因此,~10左边有27位即1。

您得到的是:

1 1 1 1 1 1 1 1  1 1 1 1 1 1 1 1  1 1 1 1 1 1 1 1  1 1 1 1 0 1 0 1

在二进制补码表示中,该数字为-11。

答案 1 :(得分:1)

大多数处理器使用一种称为Two's Complement的方法来存储负数。

此方法尽管看起来要从正2负中删除有点麻烦,但对加/减数有很好的影响。

您可以在许多示例(here is one)中查看二进制补码的工作原理

我不喜欢把这些东西弄乱,所以我使用了另一种方法,
并给您一个关于Two's Complement的直觉,我会详细说明。

二进制补码将范围分为两部分:
因此,在您的5位示例[0,(2 ^ 5-1)= 31]上:

signed将其分为两部分:
  -首先从0到15 ...
  -从-16秒到-1秒...

因此,您的示例:

  • 10101 = 21 ...
  • 21落在第二部分,因此我们减去了一半的大小(16)>> 21-16 = 5
  • 现在,将其添加到第二部分的窥视值(-16)>> -16 + 5 = -11

希望我很清楚...