From Nand To Tetris 从与非门到俄罗斯方块

12、P1 W2 U2.3 负数 与 减法

2019-07-29  本文已影响0人  shazizm

视频:
如果本次课程对应的 Coursera 的视频打不开,可以点击下面链接
P1W2U2.3 - Negative Numbers

上节讲解了 二进制的计算 和 加法器,但我们只提到了正数。遗留了两个问题
一个是负数问题
一个是溢出问题

这节就来看看 计算机世界里的 负数 如何巧妙的一次解决两个问题。

很自然如下图,会想到一种保留最左边的一位数,用来代表+和-。


不采用

很快发现这个设计有很多问题:
1.比如会出现 0 和 -0 的情况。
2.进行计算的时候还需要额外处理正负问题。

所以这个方案看起来并不是最优雅的设计。


不采用

替代设计 是一种叫 2's complement (补码)的方法。

补码:
在计算机系统中,数值一律用补码来表示和存储。
原因在于,使用补码,可以将符号位和数值域统一处理;
同时,加法和减法也可以统一处理。
此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

如下图 0 到 7。八个数都是和原来一样,对应各自二进制数。
负数 -x ,用 2^n-x 结果的二进制 来对应表示。(n是二进制位数,下图就是4)

比如 -1 就是 16-1 = 15 => 1111。那么 -1 对应的就是 1111
比如 -8 就是 16-8 = 8 => 1000。那么-8 对应的就是 1000

这样我们就避免了 -0 和 0 的重复问题。正负现在各有二进制可以代表了。
但是负数这么魔性的对应,又该如何进行加法计算呢。


我感觉因为有了这种正负数的划分,和负数的对应法。才有了只用加操作就能完成 加减法。而且还同时解决了溢出问题。

如下图,两个负数相加(-2) + (-3)。
-2 对应 1110
-3 对应 1101

1110 + 1101 = 11011 = 最左侧溢出一位抛弃 = 1011

什么? 对应 1011
-5!
而 -5 神奇地 就是 (-2) + (-3) 的结果。

这是什么神仙魔法。。。

不服气,我要试一个正数一个负数相加 2 + (-3)。
2 对应 0010
-3 对应 1101

0010 + 1101 = 1111 = 没溢出 = 1111

什么?对应 1111
-1!
服了

大概 视频 5分50 的解释了为什么这么神奇。
提到了模(modulo)。
谁能说明白,就文章下方留言吧,方便大家学习了。


“模” 的概念可以帮助理解 补数 和 补码 。

最后我们就剩一个问题需要解决了

上一个“不服”试验,假如 2-3 那么就要 先转换成 加法 2 + (-3),这里实际上我们需要先做一个转换 把 3 转成 -3。再用已知的加法操作。

那么如何把 3 转成 -3呢,或任意数 x 转换成 -x 呢。

分5步推理:

  1. 负数?公式: 2^n -x
  2. 数学小技巧:2^n -x = 1 + (2^n -1)-x
  3. 而 2^n -1 ,假设n为8,2^n = 256,256-1=255 ,255 对应 11111111
  4. 而 (2^n -1)- x 就是用 11111111 减 x,从下图右下角来看就是对 x 取反。
  1. 所以 x 转成 -x 的方法就是:x对应的二进制"取反"再加1。
二进制数 取反 就是每位 都做 not 运算。

再来做一个 4 转 -4 的变换

4 对应 0100
0100 取反 1011
1011 加一 1100
1100 对应 -4

真香

这节到此说了一个事,只要采用文章一开始的 正负数对应方法。了解 正数 转 负数的方法。我们就和上一章一样,可以不管正负,不担心溢出错误。还是 两个数 相加操作。轻松拓展了 负数 和 减法 的设计。

神奇:负数的这种表示方式,又正好能得出正确的加法结果。这是一个巧合吗?还是其中有着数学原理?

下节课,我们可以进入 ALU(算数逻辑单元) 的讲解了。

上一篇下一篇

猜你喜欢

热点阅读