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

上一章中我们通过全加器中的“加和输出”和“进位输出”在电路中完成了加法运算。

我们知道加法中存在进位,而减法中存在的则是借位,例如下面的式子:

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. 对计算机财务管理的理解,计算机财务管理实习报告.docx

    文档介绍: 计算机财务管理实****报告计算机财务管理实验报告(一)实验中,出现了一些问题列入杜邦分析,由于对财务的理论知识学的不是很扎实,所以在固定资产这块耽误了不少时间,涉及固定资产的科目太多包括 ...

  2. 对计算机财务管理的理解,计算机财务管理.doc

    计算机财务管理.doc 天津市高等教育自学考试课程考试大纲天津市高等教育自学考试课程考试大纲 课程名称计算机财务管理课程名称计算机财务管理 2008 年年 1 月版)月版) 课程代码课程代码1189 ...

  3. 对计算机财务管理的理解,计算机财务管理

    计算机财务管理 1.引用(P4-P5):易出名词解释.选择题.应识记.理解. 答:(1)相对引用(2)绝对引用(3)混合引用 2.IF.SUM.VLOOKUP.DGET函数的使用方法(P22.P28. ...

  4. 用计算机计算成品率计算公式,计算机专业英语+单词+部分习题.doc

    计算机专业英语单词部分习题 KEY TERMS 第一单元 application software应用软件 basic application基本应用软件 communication device通信 ...

  5. 计算机编程术语理解,计算机编程常用术语中英对照

    计算机编程常用术语中英对照 A A -Z Zﻫ 目录 计算机编程常用术语 A-Z A 误错ﻩ 错误! 未定义书签. B 7 ﻩC 误错ﻩ 错误! 未定义书签. D .................. ...

  6. 使用计算机计算一个多边形,计算机几何基础,计算多边形的面积, HDU-2036

    还记得我们是怎么计算多边形面积的么? 让你先思考10秒钟,Any good idea? 好吧相信你心中已经有了想法. 还记得我们学过的叉乘么,两个向量同一起点的叉乘积再乘1/2就是三角形的面积(哦哦哦 ...

  7. 计算机是怎样运行的:从根儿上理解计算机

    小册介绍 之前小孩子写了<MySQL是怎样运行的>,虽然挺受欢迎的,但受众实在太少,只有后端开发小伙伴以及部分DBA才会用到.所以这次小孩子憋了个大招,搞了一本各方通吃的小册<计算机 ...

  8. 计算机思维导论二讲答案,大学计算机计算思维导论第2讲习题与解析.pdf

    大学计算机计算思维导论第2讲习题与解析.pdf 第2讲-习题解析 战德臣 哈尔滨工业大学计算机学院教授.博士生导师 教育部大学计算机课程教学指导委员会委员 OKOK ZhanDCZhanDC Rese ...

  9. 计算机的来源知识,如何理解计算机知识及计算机发展史

    大家好,这里是链客区块链技术问答社区,今天讲一讲如何理解计算机知识,以及计算机的发展史.也感谢大家的关注~ 计算机是标准的理工科而不是文科,所以你要了解的不是它的历史,而是它最最基本的核心概念,以及后 ...

最新文章

  1. C#自定义控件一下拉颜色框
  2. SpringMVC框架结构以及架构流程
  3. 九度OJ 1437 To Fill or Not to Fill -- 贪心算法
  4. weak password
  5. squid 日志清理
  6. 如何统计当前Spark程序有多少分区?
  7. 拓端tecdat|R语言使用特征工程泰坦尼克号数据分析应用案例
  8. 鹏芯U盘(UDK2008)意外断电后修复 1
  9. MICRO SIM卡(SIM小卡)尺寸图及剪卡图解
  10. 刮刮卡 vue canvas
  11. drcom 不耍流氓
  12. Xshell7免费学生、家庭版分享
  13. mysql设置id起点_mysql自增ID起始值修改方法
  14. Java - JDK动态代理原理
  15. STM32F4驱动NEC协议的红外接收头
  16. 如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数
  17. 校园点餐系统:点餐、食堂管理、商户管理和菜品管理(Java和MySQL)
  18. unity3D第一人称射击游戏(推荐)
  19. mysql grant reload,MySQL执行GRANT命令时报错ERROR 1045解决办法
  20. 那些迷茫的程序员你们需要过来看看!!!!

热门文章

  1. 有两种歌声可以打动我
  2. 艾司博讯:拼多多商家哪些行为会被封店
  3. 聊一聊关于聊天记录的存储
  4. Python—time模块
  5. 京东新通路联手和路雪打造低温产品B2B新渠道
  6. Python常见经典语法
  7. android 启动手机上自带浏览器
  8. BUUCTF 铁人三项(第五赛区)_2018_rop
  9. java作业:用GUI实现一个科学计算器的设计
  10. WebStorm设置px转换rem插件