为什么两个补充?

时间:2011-07-28 02:35:07

标签: computer-science twos-complement

我正在编写教程,教孩子们(9到13岁)关于编程。我从计算机本身开始,他们没有那么多与计算机科学有关,而是更多地涉及解决计算问题的过程。

有了这个起点,我引导他们理解机器可以帮助我们解决某些计算问题。人们擅长抽象思维和想象力,但计算机在遵循一个明确的例行程序时非常棒。他们可以一次又一次地以惊人的速度做到这一点!

我的教程已经介绍了以二进制格式表示数字。但是你如何代表负数呢?在任何符号系统中,有很多方法可以做到这一点,但为计算机选择的系统有一个非常特殊的原因:减少添加有符号整数值所涉及的机器数量。我们不希望构建和构建单独的芯片只是为了处理负数,我们想要使用我们用于自然数算术的相同芯片!

如果有人在街上问你(这看起来完全不现实)“计算机如何代表负数,为什么他们用这种方式代表他们?”

我的具体问题:

  
      
  1. 计算机如何表示负数?

  2.   
  3. 为什么计算机会以这种方式表示负数?

  4.   

我猜这个经验丰富的开发人员不得不考虑一下这个问题。有些人甚至可能无法得出答案。我不是想要浮夸,这是来自实际经验,我问过专业开发人员这个问题他们无法回答。他们画了一个空白的凝视。给他们JBoss和JavaBeans,他们会让你充满自信。好笑!我也很难解决这个问题,我每次都要提醒自己,我需要一张纸或白板来制定解决方案。我希望能引导学生更好地了解他们正在使用的机器。

6 个答案:

答案 0 :(得分:27)

  

1.计算机如何代表负数?

取正值,反转所有位并加1。

  

2.为什么计算机会以这种方式表示负数?

很容易在-7中添加7并且得出零。位操作很快。


如何让它变得简单?

以7和-7为例。如果您将7表示为00000111,则要查找-7将所有位反转并添加一个:

11111000 -> 11111001

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

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

对于计算机而言,这种操作相对容易,因为它基本上是逐位比较并携带一个。

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

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

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

不要忘记@trashgod所说的,在2的补码中你只有一个零。检查一下:

  

00000000
  11111111(反转所有位)
  00000000(添加一个)

不同于00000000 0 )等于10000000 -0

答案 1 :(得分:6)

计算机如何表示负数?

如果您使用正常的减法规则从0减去该数字,计算结果将代表负数。也就是说,要查找二进制文件中的-5,您可以从5(二进制)中减去0(二进制):

0  0  0  0 -
0  1  0  1
----------

              (borrow)
-> 1 -> 1 -> 1 ->10 -
   0    1    0    1
   ----------------
   1    0    1    1

..所以-5在二进制文件中看起来像1011

为什么计算机会以这种方式表示负数?

因为这样做意味着当计算机添加和减去数字时,它不必检查它们中的一些是否为负数:无论如何数学运算。这使计算机更简单,更简单的计算机构建起来更便宜。

答案 2 :(得分:6)

  

为什么计算机会以这种方式表示负数?

我能想到的两个重要原因:

  • 基本算术运算的简单性。您不必担心检查符号位以决定是添加还是减去。
  • 代表性的独特性。很高兴不必担心负零,因为没有办法在二进制补码中表示负零。

From Wikipedia:

  

二进制补码系统的优点是不需要加法和减法电路检查操作数的符号来确定是加或减。该属性使系统更易于实现,并且能够轻松处理更高精度的算术。此外,零只有一个表示,避免了与负零相关的细微差别,它存在于补充系统中。

答案 3 :(得分:3)

记下一个数字行

-32768 ... -1,0,1,2,... 32767

向右添加移动。减法移动到左侧。概念上很好,但我们如何才能代表这个标志呢?

我们可以使用“符号幅度”,其中符号和值是分开的。这让人感到困惑,因为我们有两条带有不同符号的平行数字线。

“带符号幅度”的替代方法是将每个数字编码为另一个数字。

我们可以为所有数字添加32768的偏移量。新范围是无符号0到65535.一切仍然有效,对吧?您只需将固定偏差值应用于所有数字。添加移动到右侧。减法移动到左侧。 32768可以被解码为0. 0可以被解码为-32768。

这完美无缺。 “编码”数字只是添加偏见。 “解码”一个数字只是减去了偏见。

这是另一种编码方案。

将所有负数转移到数字行的另一侧。

0,1,2,...,32767,-32768,... -1

添加仍然向右移动。取任何数字(有一个例外)。它右边的数字总是更大。

一个例外是32767.右边的数字是“溢出”。

减去仍然向左移动。取任何数字(有一个例外)。左边的数字总是较小。唯一的例外是-32768。左边的数字是“下溢”。

编码和解码更复杂一些。 0到32767有一个简单的编码和解码:什么都不做。这些数字被编码为自己。但是,32768到65535是负数的编码。

答案 4 :(得分:1)

两个恭维用于简化加法和减法到一个操作,可以由一个硬件单元执行。而不是从另一个中减去一个数字,在两个恭维算术中,你将一个数字与另一个数字相反。回到过去,有一个单独的硬件用于减去数字将是一个非常大的问题,所以想出一个系统来执行减法和单个单位的添加是非常有用的。

你可以通过翻转位并添加一个来找到两个恭维中任意数字的倒数。例如,-1将在四位实现中表示如下:

 1: 0001
-1: 1110 + 1 = 1111

您可以通过添加两个来验证这一点:

 0001 + 1111 = 10000

然而,我们正在处理四位,因此结果被截断。我们现在有00000。我们添加了一个数字,它的负数和零。乌拉!

现在,最后一个例子,让我们做4 - 6. 4表示为0100。 6表示为0110。要获得-6,请翻转位并添加一个:1001 + 1 = 10100100 + 1010 = 11101110是一个负数(所有数字中最高位数为1的数字在两个赞美中均为负数)。为了找出它的绝对值,我们翻转这些位并添加1. 0001 + 1 = 0010或2.因此,我们添加的结果为-24 - 6 -2。我们的数学检查。

祝贺。你现在和计算机一样聪明。

答案 5 :(得分:0)

Q1。计算机如何代表负数?

2's compliment method!

Q2。为什么计算机以这种方式表示负数?

以下是2的赞美作品:

对于任何x,

x + ~x   = all the bits set  
x + ~x   = 2^m - 1      (2^m = the range of numbers we opt)  
  -x     = ~x + 1 - 2^m (we can cancel out mod 2^m, which gives)  
  -x     = ~x + 1 

正如您所看到的,2的赞美是合乎逻辑且易于实施的,并且没有极端情况,这就是为什么它比其他方法更受欢迎。
让我们考虑1's compliment,一个我正在谈论的极端情况的方法,其中存在0和-0(所有位未设置= 0,所有位设置= -0),这转换为更多操作以执行硬件电路,特别是在具有数字x和-0的操作期间。 [维基百科在Avoiding Negative Zero上有很好的例子,你可以查看它们]

我希望这个解释能够抚慰你孩子的思想......