理解计算机(二)---如何实现减法

阅读本文需提前学习《编码---隐匿在计算机软硬件背后的语言》前十二章

上一章中我们通过全加器中的“加和输出”和“进位输出”在电路中完成了加法运算。
我们知道加法中存在进位,而减法中存在的则是借位,例如下面的式子:

16 - 8 = ?

减数16的个位要比被减数的个位大,所以需要从被减数的十位借1个10(1位)过来完成整个运算。
在计算机中其实没有用来实现减法的逻辑门,它是通过加法来实现的。因为任何减法比如X - Y都可以表示为X + (-Y)。因为加法器我们已经完成,那么现在的问题就变成了负数如何在计算机中表示?
你可能会说直接在数字前面加符号即可,但是要知道计算机其实只认识“0”和“1”,它并不认识负号。
其实解决方法也很简单,假设我们的十进制数取值范围是-128-127,那么从0-127我们就用他们对应的8位二进制范围就是00000000-01111111。
我们发现8位二进制数的范围是00000000-11111111,而刚刚我们只是用到了所有最高位是0的二进制数字,以1开头的二进制数字都没有用到,那么我们就用这些以1开头的二进制数字来表示-128--1这个范围内所有的数字。也就是说8位二进制的最高位是一个符号位,1代表负数,0代表正数。

二进制对比表
二进制对比表

到此我们解决了上面提出的问题,负数如何在计算机中表示。我们回到最开始的那个式子:

16 - 8 = ?

我们可以把式子写成下面的形式:

16 - 8 = 16 + (-8)

就是上面我们所说的任何减法都可以写成X + (-Y)的形式。
16的二进制是00010000,而-8的二进制形式就是上面我们所说的10001000,其中最高位的1代表是负数的意思。
那么两个数相加
 0 0 0 1 0 0 0 0
+1 0 0 0 1 0 0 0
—————————
 10 0 1 1 0 0 0
换算成十进制就是-24,这显然不是我们想要的答案。
在这里我们要明白,负数在计算机内部用什么方式表示都是无所谓的,只要能保证一一对应的关系就可以。那么肯定是怎么方便怎么来。上面的形式虽然说可以表示一定范围内的每个负数,但是正常的加法规则不适用于正数与负数的加法,因此必须制定两套运算规则,一套用于正数加正数,还有一套用于正数加负数。从电路上说,就是必须为加法运算做两种电路。于是,我们的先人们就发明了“补码”这种东西。
所谓补码,在二进制中,就是说正数的补码还是其本身,而负数的补码是首位不变,其原码(本身)取反变成反码再加1。或者说成是其绝对值的原码取反再加1。
这样做的好处是什么呢?
还看上面的例子,-8的补码应该是10001000取反得到反码11110111再加1得到补码11111000。两个数相加
 0 0 0 1 0 0 0 0
+1 1 1 1 1 0 0 0
————————
1 0 0 0 0 1 0 0 0
可以看到,按照正常的加法规则,得到的结果是100001000。注意,这是一个9位的二进制数。我们已经假定这是一台8位机,因此最高的第9位是一个溢出位,会被自动舍去。所以,结果就变成了00001000,转成十进制正好是8,也就是16 + (-8) 的正确答案。这说明了,2的补码表示法可以将加法运算规则,扩展到整个整数集,从而用一套电路就可以实现全部整数的加法。
所以说,在计算机中,所有数字都是以补码的形式存储的。
现在我们已经完美解决了负数在计算机中的表示方式,下面我们只需要通过逻辑门来搭建出可以计算减法的工具即可。
我们把之前全加器的面板做一点改动,如下图:

加法减法面板
加法减法面板

它在最左侧增加一个开关和一个灯泡,开关用来选择加法还是减法。灯泡表示“上溢/下溢”。这个灯泡表明了正在计算的数字是一个不能用8个灯泡表示的数字。如果在加法中得到的结果大于255(上溢)或者在减法中得到了负数(下溢)这个灯泡就会发光。
这个设备的加法部分我们在上一章已经完成,现在只需要解决减法部分即可,我们已经知道在计算机中,所有数字都是以补码的形式存储的。在二进制中取补码只要把对应的1变成0、0变成1后再加1即可。自然而然就可以想到反向器,它的功能正是我们需要的。我们直接把电路改造为如下图:
求补器电路图
求补器电路图

标记为“取反”的线路将被输入到每一个异或门中,回想一下异或门的工作方式:
异或门工作方式
异或门工作方式

我们可以发现,当“取反”信号是0,则8个异或门输出与输入是相同的。当“取反”信号是1,8个异或门的输入与输出则不同。这个装置叫做求补器,如下所示:
求补器简图
求补器简图

我们想要做的是在一个机器里同时实现加/减法,将一个求补器,一个8位二进制加法器和一个异或门做如下连接:
加减法器
加减法器

上图三个"SUB"标识就是加/减法转换开关,当都为0时,B输入经过求补器不变,CI进位输入为0,CO进位输出经过异或门仍然等于其本身。可以看到其做的就是加法运算。当CO为1时(代表最后有进位)最左侧灯泡亮,表示加法计算结果大于255。
当三个“SUB”都为1时,进行的是减法运算既“X + (-Y)”,我们要得到的是-Y(B输入)的补码,B输入经过求补器取反得到输出,CI端进入表示加1,这里就巧妙的得到了B输入的补码(这里就是将-Y的绝对值的原码取反再加1)。之后再将其与A输入相加即可得到结果。还有一点要注意的是当减数(B输入)小于被减数(A输入)时,CO端输出为1代表溢出(既减法最后一步减去100000000,或者叫忽略进位),因为SUB也为1,所以两个信号经过一个异或门输出为0,所以最左侧灯不亮代表结果是正数。相反,当CO端输出为0时,最左侧灯泡亮,代表下溢,既结果是个负数。
最后我们用一个例子来看下关于减法部分的原理。
一、减数小于被减数

3(00000011) - 2(00000010) = ?

等于求

3 + (-2) = ?

第一步:求-2的补码,既求-2的绝对值2的原码取反(11111101)再加1得11111110。在上图中就是输入B经过取反再加CI等于11111110。
第二步:3的补码(00000011)加上-2的补码(11111110)等于100000001。在上图中就是最后进位1等于CO输出(舍去)即可得到00000001。而CO与SUB均为1,经过异或门为0,灯泡不亮。
二、减数大于被减数

2 - 3 = ?

等于求

2 + (-3) = ?

第一步:求-3的补码,既求-3的绝对值3的原码取反(11111100)再加1得11111101。在上图中就是输入B经过取反再加CI等于11111101。
第二步:2的补码(00000010)加上-3的补码(11111101)等于11111111。在上图中就是最后进位0等于CO输出。而SUB为1,两个输入1、0经过异或门得1,最左侧灯泡亮,表示结果为负数。
这里结果11111111明明是255,为什么说是个负数呢?
还记得前面出现的这个图吗?


二进制对比表
二进制对比表

我们把最高位为1的所有8位二进制数去表示-128--1了,所以11111111就是-1。
至此我们在一个电路中实现了加法与减法。

参加资料:
1、关于2的补码
2、原码, 反码, 补码 详解
3、编码:隐匿在计算机软硬件背后的语言

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,873评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,483评论 1 306
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,525评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,595评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,018评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,958评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,118评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,873评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,643评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,813评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,293评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,615评论 3 262
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,306评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,170评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,968评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,107评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,894评论 2 278

推荐阅读更多精彩内容