为什么两个补充?

dva*_*ria 14 computer-science twos-complement

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

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

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

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

我的具体问题:

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

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

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

sid*_*yll 28

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

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

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

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


它如何变得简单?

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

11111000 -> 11111001
Run Code Online (Sandbox Code Playgroud)

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

  00000111
+ 11111001
-----------
  00000000
Run Code Online (Sandbox Code Playgroud)

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

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

  00000111
+ 10000111
-----------
  10001110 (-14)
Run Code Online (Sandbox Code Playgroud)

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

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

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

不同于00000000(0)等于10000000(-0)

  • @agf,如果有人问我在街上我会回答这个问题.如果问题是关于2的补码,这个人可能知道什么. (3认同)
  • @dvanaria首先解释了如何用二进制表示正数.**如果没有先理解这一点,你就无法理解两个补语.** (3认同)
  • 街上的人不知道是什么位,或者它们意味着将它们反转. (2认同)
  • @dvanaria如果你证明了` - ( - 5)= 5',它也会有助于吸引他们的直觉.这将"向他们证明"添加1并不具有破坏性,并且即使您添加了两次,也会获得原始数字. (2认同)

caf*_*caf 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
Run Code Online (Sandbox Code Playgroud)

..所以-5看起来像1011二进制.

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

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


Mat*_*all 6

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

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

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

来自维基百科:

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