5

由 N 位表示的数字的 2 的补码是 2^N 数。
例如:如果数字是 7 (0111) 并且我使用 4 位来表示它,那么它的 2 的补码将是 (2^N-number) 即 (2^4 -7)=9(1001)

7==> 0111
1's compliment of 7==> 1000
1000
+  1
-------------
1001 =====> (9)

在计算数字的 2 的补码时,我们执行以下步骤: 1. 对数字 2. 进行反码 2. 将步骤 1 的结果加 1。

我知道我们需要对数字进行补码,因为我们正在进行求反操作。但是为什么我们要加 1 呢?

这可能是一个愚蠢的问题,但我很难理解其中的逻辑。用上面的例子来解释(对于数字 7),我们做一个补码得到 -7 然后加 +1,所以 -7+1=-6,但我们仍然得到正确的答案,即 +9

4

4 回答 4

12

您的错误在于“我们恭维并得到-7”。要了解为什么这是错误的,请取 7 的补码并在其上加 7。如果是 -7,你应该得到零,因为 -7 + 7 = 0。你不会。

7 的反码是1000. 再加上 7,你得到1111. 绝对不是零。你需要再加一个才能得到零!

数字的负数是您需要添加到它以得到零的数字。

如果你1加到...11111,你得到零。因此,-1 表示为全 1 位。

如果您将一个数字(例如x)添加到其 1 的补码~x中,您将得到所有 1 位。

因此:
~x + x = -1

两边加 1:
~x + x + 1 = 0

从两边减去 x:
~x + 1 = -x

于 2013-02-12T13:43:17.863 回答
5

添加 +1 以便处理技术中的结转。

以 7 和 -7 为例。

如果您将 7 表示为00000111

为了找到-7:

反转所有位并加一

11111000 -> 11111001

现在您可以添加以下标准数学规则:

  00000111
+ 11111001
 -----------
  00000000

对于计算机来说,这个操作相对容易,因为它基本上涉及到逐位比较和携带一个。

相反,如果您将 -7 表示为 10000111,这将没有意义:

   00000111
+  10000111
  -----------
   10001110 (-14)

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

更详细的解释可以在这里找到。

于 2013-02-12T13:51:34.960 回答
1

简短的回答:如果你不添加1,那么你有两个不同的数字表示0

更长的答案:在一个互补

  • 从到的值表示从00000111的数字07

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

    • 因为它们的倒数是00000111

有问题,现在你有两种不同的方式来写相同的数字,两者00001111代表0

如果您将 1 加到这些倒数上,它们将变为00011000表示从-1to的数字,-8因此您可以避免重复。

于 2019-07-12T22:23:03.887 回答
0

我将直接回答标题所要求的内容(抱歉,细节对每个人来说并不像理解翻转位+加一个来自何处那样普遍)。

首先让我们回顾一下我们可以用它们进行标准(小学)算术(即添加数字和进行结转等)的事实来激发二进制补码。易于计算是这种表示的动机(我假设这意味着我们只有 1 个硬件来做加法而不是 2 如果我们以不同的方式实现减法而不是加法,并且我们在小学加法中以不同的方式做和减法)。

现在回想一下二进制补码中每个数字的含义以及这种形式的一些二进制数作为示例(幻灯片来自麻省理工学院的 6.004 课程):

在此处输入图像描述

现在请注意,算术在这里正常工作,符号包含在二进制补码本身的二进制数中。特别注意:

1111....1111 + 0000....1 = 000....000 IE -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) where Ais in two's补码。所以我们需要计算的是二进制补码格式中-1和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。


评论:

我认为对我有帮助的评论是补码类似于逆,但不是给02^N(根据定义),例如,A我们想要的数字是A+~A=2^N3位。至少这澄清了“补语”这个词在这里的含义,因为它不仅仅是和的含义的反转。010 + 110 = 1000 = 82^301


如果您忘记了二进制补码是什么,这可能会有所帮助:什么是“2 的补码”?


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

于 2020-09-15T20:54:49.143 回答