视频:
如果本次课程对应的 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步推理:
- 负数?公式: 2^n -x
- 数学小技巧:2^n -x = 1 + (2^n -1)-x
- 而 2^n -1 ,假设n为8,2^n = 256,256-1=255 ,255 对应 11111111
- 而 (2^n -1)- x 就是用 11111111 减 x,从下图右下角来看就是对 x 取反。
二进制数 取反 就是每位 都做 not 运算。
- 所以 x 转成 -x 的方法就是:x对应的二进制"取反"再加1。
再来做一个 4 转 -4 的变换
4 对应 0100
0100 取反 1011
1011 加一 1100
1100 对应 -4
这节到此说了一个事,只要采用文章一开始的 正负数对应方法。了解 正数 转 负数的方法。我们就和上一章一样,可以不管正负,不担心溢出错误。还是 两个数 相加操作。轻松拓展了 负数 和 减法 的设计。
神奇:负数的这种表示方式,又正好能得出正确的加法结果。这是一个巧合吗?还是其中有着数学原理?
下节课,我们可以进入 ALU(算数逻辑单元) 的讲解了。
网友评论