为什么我们需要在做2的补码时加1

时间:2013-02-12 13:33:57

标签: math bit-manipulation twos-complement

由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

4 个答案:

答案 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)

要添加它们,您将涉及更复杂的规则,例如分析第一位和转换值。

A more detailed explanation can be found here.

答案 2 :(得分:1)

简短的回答::如果不添加1,则数字0有两种不同的表示形式。

更长的答案:您有一个补充

  • 00000111的值代表从07的数字

  • 11111000的值表示从0-7的数字

    • 因为它们的倒数分别为00000111

有问题,现在您可以通过两种不同的方式来写入相同的数字,00001111都代表0

如果在这些逆数上加1,它们将变成00011000,并代表从-1-8的数字,因此避免重复。

答案 3 :(得分:0)

我将直接回答标题的要求(对不起,每个人的细节都没有理解翻转位+加一个的来源那么普遍)。

首先,让我们回想一下two's complement的动机,我们可以用它们来执行标准(小学)算术(即,添加数字并进行结转等)。易于计算是促使这种表示方式的原因(我假设这意味着我们只用1个硬件执行加法,而不是如果我们用与加法不同的方式实现减法,那么我们就用2个硬件,并且在小学加法中我们做减法也不同)。

现在回想一下以二进制补码形式表示的每个数字的含义,并以这种形式的一些二进制数字为例(slides borrowed from MIT's 6.004 course):

enter image description here

现在请注意,算术在这里正常工作,并且符号以二进制补码形式包含在二进制数内。特别注意:

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^30含义的颠倒。


如果您忘记了两个补码可能会有所帮助:What is “2's Complement”?


我希望在某些时候阅读科内尔的答案:https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html#whyworks