我正在学习C ++,想知道为什么会这样。
我知道第一位处理该值是否为负。
但是,如果您有0 1 0 1 0并执行〜,您将得到1 0 1 0 1对吗?
请有人帮我解决这个问题。谢谢!
答案 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秒...
因此,您的示例:
希望我很清楚...