17

我正在写一个教程来教孩子(9 到 13 岁)编程。我从计算机本身开始,它们与计算机科学没有太大关系,它更多的是关于解决计算问题的过程。

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

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

如果有人在街上问你(这看起来完全不现实)“计算机如何表示负数,为什么它们会这样表示?”

我的具体问题:

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

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

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

4

6 回答 6

30

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 )

于 2011-07-28T02:37:52.823 回答
6

计算机如何表示负数?

计算机通过计算从零减去该数字所得到的结果来表示负数,使用它们的正常减法规则。也就是说,要找到-5二进制的样子,你从5(二进制)中减去(0二进制):

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

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

..so-5看起来像1011二进制。

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

因为这样做意味着当计算机在加减数字时,它不必检查其中一些是否为负数:无论如何,数学都是可行的。这使得计算机更简单,更简单的计算机制造成本更低。

于 2011-07-28T02:40:44.933 回答
6

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

我能想到的两大原因:

  • 基本算术运算的简单性。您不必担心检查符号位来决定是加还是减。
  • 表示的唯一性。不必担心负零很好,因为没有办法在二进制补码中表示负零。

来自维基百科:

二进制补码系统的优点是不需要加法和减法电路检查操作数的符号以确定是加还是减。此属性使系统更易于实现并且能够轻松处理更高精度的算术。此外,零只有一个表示,消除了与负零相关的微妙之处,后者存在于一个补码系统中。

于 2011-07-28T02:40:48.033 回答
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 是负数的编码。

于 2011-07-28T03:00:23.510 回答
1

二进制补码用于将加法和减法简化为一个可以由一个硬件单元执行的操作。不是从另一个数字中减去一个数字,而是在二进制补码算术中将一个数字的倒数加到另一个数字上。回到过去,拥有一个单独的硬件来减法是​​一件大事,所以想出一个用一个单元来执行减法和加法的系统非常有用。

您可以通过翻转位并加一来找到二进制补码中任何数字的倒数。例如,-1将在四位实现中表示如下:

 1: 0001
-1: 1110 + 1 = 1111

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

 0001 + 1111 = 10000

但是,我们正在使用四位,因此结果被截断。我们现在有00000。我们添加了一个数字及其负数并得到零。欢呼!

现在,对于最后一个示例,让我们执行 4 - 6。4 表示为0100。6 表示为0110。要获得 -6,请翻转位并添加一个:1001 + 1 = 10100100 + 1010 = 1110. 1110是一个负数(所有1最高有效位为 a 的数字在二进制补码中都是负数)。为了找出它的绝对值,我们翻转位并加 10001 + 1 = 0010或 2。因此,我们加法的结果是-24 - 6 -2. 我们的数学检查出来了。

恭喜。你现在和电脑一样聪明。

于 2011-07-28T02:49:39.263 回答
0

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

2的赞美方法!

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 的恭维,这是我正在谈论的一种极端情况的方法,其中存在 0 和 -0(所有未设置的位 = 0,所有位设置 = -0),这意味着要为硬件电路执行更多操作,尤其是在数字 x 和 -0 的操作期间。[维基百科有很好的避免负零的例子,你可以看看他们]

我希望这个解释能抚慰你的孩子的心灵......

于 2015-11-03T13:10:33.217 回答