由N位表示的数字的2的补码是2 ^ N数。
例如:如果number是7(0111)并且我用4位表示它,那么它的2的补码将是(2 ^ N数),即(2 ^ 4 -7)= 9(1001)>
7==> 0111
1's compliment of 7==> 1000
1000
+ 1
-------------
1001 =====> (9)
在计算数字的2的补码时,我们执行以下步骤: 1.做一个补码 2.在步骤1的结果中添加一个。
我知道我们需要做一个补码,因为我们正在做一个否定操作。但为什么我们要添加1?
这可能是一个愚蠢的问题,但我很难理解逻辑。为了解释上面的例子(对于数字7),我们做一个补码并得到-7然后加+1,所以-7 + 1 = -6,但我们仍然得到正确答案,即+9
答案 0 :(得分:13)
你的错误在于“我们恭维并获得-7”。要知道为什么这是错误的,取一个7的补码并加7。如果它是-7,你应该得到零,因为-7 + 7 = 0.你不会。
7的补码是1000
。添加7,你得到1111
。绝对不是零。您需要再添加一个才能获得零!
数字的负数是你需要添加到它的数字才能得到零。
如果您将1
添加到...11111
,则会获得零。因此-1表示为全1位。
如果您在1的补码x
中添加一个数字,比如说~x
,那么您将获得全部1位数。
因此:
~x + x = -1
双方加1:
~x + x + 1 = 0
从双方减去x:
~x + 1 = -x
答案 1 :(得分:5)
增加+1,以便处理技术中的遗留。
以7和-7为例。
如果您将7表示为00000111
为了找到-7:
反转所有位并添加一个
11111000 -> 11111001
现在您可以添加以下标准数学规则:
00000111
+ 11111001
-----------
00000000
对于计算机而言,这种操作相对容易,因为它基本上是逐位比较并携带一个。
如果您将-7表示为10000111,那么这将没有意义:
00000111
+ 10000111
-----------
10001110 (-14)
要添加它们,您将涉及更复杂的规则,例如分析第一位和转换值。
答案 2 :(得分:1)
简短的回答::如果不添加1
,则数字0
有两种不同的表示形式。
更长的答案:您有一个补充
从0000
到0111
的值代表从0
到7
的数字
从1111
到1000
的值表示从0
到-7
的数字
0000
和0111
。 有问题,现在您可以通过两种不同的方式来写入相同的数字,0000
和1111
都代表0
。
如果在这些逆数上加1,它们将变成0001
和1000
,并代表从-1
到-8
的数字,因此避免重复。
答案 3 :(得分:0)
我将直接回答标题的要求(对不起,每个人的细节都没有理解翻转位+加一个的来源那么普遍)。
首先,让我们回想一下two's complement的动机,我们可以用它们来执行标准(小学)算术(即,添加数字并进行结转等)。易于计算是促使这种表示方式的原因(我假设这意味着我们只用1个硬件执行加法,而不是如果我们用与加法不同的方式实现减法,那么我们就用2个硬件,并且在小学加法中我们做减法也不同)。
现在回想一下以二进制补码形式表示的每个数字的含义,并以这种形式的一些二进制数字为例(slides borrowed from MIT's 6.004 course):
现在请注意,算术在这里正常工作,并且符号以二进制补码形式包含在二进制数内。特别注意:
1111....1111 + 0000....1 = 000....000
即
-1 + 1 = 0
利用这个事实,让我们尝试得出-A
的两个补码表示应该是什么。因此要解决的问题是:
问:给定A
的补码表示形式是什么?
为此,我们使用我们知道的值做一些代数:
-A
现在让我们使A + (-A) = 0 = 1 + (-1) = 11...1 + 00000...1 = 000...0
的主题表示为以二进制补码表示的数字:
-A
其中-A = 1 + (-1 - A) = 000.....1 + (111....1 - A)
是二进制补码。因此,我们需要计算的是二进制补码形式的-1和A的减法。为此,我们注意到数字是如何以其底数(即A
)的线性组合表示的:
2^i
1*-2^N-1 + 1 * 2^N-1 + ... 1 = -1
a_N * -2^N-1 + a_N-1 * 2^N-1 + ... + a_0 = A
--------------------------------------------- (subtract them)
从本质上讲意味着我们将每个数字减去其对应的值。最终只是简单地翻转位,结果如下:
a_N-1 * -2^N-1 + a_N-1 -1 * 2^N-1 + ... + a_0 -1 = A
其中-A = 1 + (-1 - A) = 1 + ~ A
是位翻转的。这就是为什么您需要翻转并添加1.的原因。
备注:
我认为对我有用的一条评论是,补码类似于逆运算,但不是给出~
,而是给出0
(根据定义),例如3位数字2^N
,我们想要A
,所以A+~A=2^N
就是010 + 110 = 1000 = 8
。至少这澄清了“补语”一词在这里的含义,因为它不仅是2^3
和0
含义的颠倒。
如果您忘记了两个补码可能会有所帮助:What is “2's Complement”?
我希望在某些时候阅读科内尔的答案:https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html#whyworks