请点评

我们已经了解了计算机中正整数如何表示,加法如何计算,那么负数如何表示,减法又如何计算呢?本节讨论这些问题.为了书写方便,本节举的例子都用8个bit表示一个数,实际计算机做整数加减运算的操作数可以是8位、16位、32位甚至64位的.

要用8个bit表示正数和负数,一种简单的想法是把最高位规定为符号位(Sign Bit),0表示正1表示负,剩下的7位表示绝对值的大小,这称为Sign and Magnitude表示法.例如-1表示成10000001,+1表示成00000001.这样用8个bit表示整数的取值范围是-27-1~27-1,即-127~127.

采用这种表示法,计算机做加法运算需要处理以下逻辑:

如果两数符号位相同,就把它们的低7位相加,符号位不变.如果低7位相加时在最高位产生进位,说明结果的绝对值大于127,超出7位所能表示的数值范围,这称为溢出(Overflow)[24],这时通常把计算机中的一个标志位置1表示当前运算产生了溢出.

如果两数符号位不同,首先比较它们的低7位谁大,然后用大数减小数,结果的符号位和大数相同.

那么减法如何计算呢?由于我们规定了负数的表示,可以把减法转换成加法来计算,要计算a-b,可以先把b变号然后和a相加,相当于计算a+(-b).但如果两个加数的符号位不同就要用大数的绝对值减小数的绝对值,这一步减法计算仍然是免不了的.我们知道加法要进位,减法要借位,计算过程是不同的,所以除了要有第 1 节 "为什么计算机用二进制计数"提到的加法器电路之外,还要另外有一套减法器电路.

如果采用Sign and Magnitude表示法,计算机做加减运算需要处理很多逻辑:比较符号位,比较绝对值,加法改减法,减法改加法,小数减大数改成大数减小数……这是非常低效率的.还有一个缺点是0的表示不唯一,既可以表示成10000000也可以表示成00000000,这进一步增加了逻辑的复杂性,所以我们迫切需要重新设计整数的表示方法使计算过程更简单.

本节介绍一种二进制补码表示法,为了便于理解,我们先看一个十进制的例子:

167-52=167+(-52)=167+(999-52)-1000+1=167+947-1000+1=1114-1000+1=114+1=115

167-52 → 减法转换成加法 167+(-52) → 负数取9的补码表示 167+947 → 114进1 → 高位进的1加到低位上去,结果为115

在这个例子中我们用三位十进制数字表示正数和负数,具体规定如下:

表14.5. 9's Complement表示法

数值 补码表示

首先-52要用999-52表示,就是947,这称为取9的补码(9's Complement);然后把167和947相加,得到114进1;再把高位进的1加到低位上去,得115,本来应该加1000,结果加了1,少加了999,正好把先前取9的补码多加的999抵消掉了.我们本来要做167-52的减法运算,结果变成做999-52的减法运算,后者显然要容易一些,因为没有借位.这种补码表示法的计算规则用一句话概括就是:负数用9的补码表示,减法转换成加法,计算结果的最高位如果有进位则要加回到最低位上去.要验证这条规则得考虑四种情况:

两个正数,相加得正

一正一负,相加得正

一正一负,相加得负

两个负数,相加得负

我们举的例子验证了第二种情况,另外三种情况请读者自己验证,暂时不考虑溢出的问题,稍后会讲到如何判定溢出.

上述规则也适用于二进制: 负数用1的补码(1's Complement)表示,减法转换成加法,计算结果的最高位如果有进位则要加回到最低位上去 .取1的补码更简单,连减法都不用做,因为1-1=0,1-0=1,取1的补码就是把每个bit取反,所以1的补码也称为反码.比如:

00001000-00000100 → 00001000+(-00000100) → 00001000+11111011 → 00000011进1 → 高位进的1加到低位上去,结果为00000100

1's Complement表示法相对于Sign and Magnitude表示法的优势是非常明显的:不需要把符号和绝对值分开考虑,正数和负数的加法都一样算,计算逻辑更简单,甚至连减法器电路都省了,只要有一套加法器电路,再有一套把每个bit取反的电路,就可以做加法和减法运算.如果8个bit采用1's Complement表示法,负数的取值范围是从10000000到11111111(-127~0),正数是从00000000到01111111(0~127),仍然可以根据最高位判断一个数是正是负.美中不足的是0的表示仍然不唯一,既可以表示成11111111也可以表示成00000000,为了解决这最后一个问题,我们引入2's Complement表示法.

2's Complement表示法规定:正数不变,负数先取反码再加1.如果8个bit采用2's Complement表示法,负数的取值范围是从10000000到11111111(-128~-1),正数是从00000000到01111111(0~127),也可以根据最高位判断一个数是正是负,并且0的表示是唯一的,目前绝大多数计算机都采用这种表示法.为什么称为" 2的补码 "呢?因为对一位二进制数b取补码就是1-b+1=10-b,相当于从2里面减去b.类似地,要表示-4需要对00000100取补码,11111111-00000100+1=100000000-00000100,相当于从28里面减去4.2's Complement表示法的计算规则有些不同:减法转换成加法,忽略计算结果最高位的进位,不必加回到最低位上去.请读者自己验证上一节提到的四种情况下这条规则都能算出正确结果.

8个bit采用2's Complement表示法的取值范围是-128~127,如果计算结果超出这个范围就会产生溢出,例如:

图14.3. 有符号数加法溢出

如何判断产生了溢出呢?我们还是分四种情况讨论:如果两个正数相加溢出,结果一定是负数;如果两个负数相加溢出,结果一定是正数;一正一负相加,无论结果是正是负都不可能溢出.

图14.4. 如何判定溢出

从上图可以得出结论: 在相加过程中最高位产生的进位和次高位产生的进位如果相同则没有溢出,如果不同则表示有溢出 .逻辑电路的实现可以把这两个进位连接到一个异或门,把异或门的输出连接到溢出标志位.

3.4. 有符号数和无符号数 请点评

前面几节我们用8个bit表示正数和负数,讲了三种表示法,每种表示法对应一种计算规则,这称为有符号数(Signed Number);如果8个bit全部表示正数则取值范围是0~255,这称为无符号数(Unsigned Number).其实计算机做加法时并不区分操作数是有符号数还是无符号数,计算过程都一样,比如上面的例子也可以看作无符号数的加法:

图14.5. 无符号数加法进位

如果把这两个操作数看作有符号数-126和-8相加,计算结果是错的,因为产生了溢出;但如果看作无符号数130和248相加,计算结果是122进1,也就是122+256,这个结果是对的.计算机的加法器在做完计算之后,根据最高位产生的进位设置 进位标志 ,同时根据最高位和次高位产生的进位的异或设置 溢出标志 .至于这个加法到底是有符号数加法还是无符号数加法则取决于程序怎么理解了,如果程序把它理解成有符号数加法,下一步就要检查溢出标志,如果程序把它理解成无符号数加法,下一步就要检查进位标志.通常计算机在做算术运算之后还可能设置另外两个标志,如果计算结果的所有bit都是零则设置 零标志 ,如果计算结果的最高位是1则设置 负数标志 ,如果程序把计算结果理解成有符号数,也可以检查负数标志判断结果是正是负.

[24] 有时候会进一步细分,把正整数溢出称为上溢(Overflow),负整数溢出称为下溢(Underflow),详见strtol(3).

◆◆

评论读取中....

请登录后再发表评论!

◆◆

修改失败,请稍后尝试

计算机处理负数加法,怎么让加法器实现两个负数相加相关推荐

  1. 计算机组成原理 定点加法、减法 练习题

    一.选择题 1.定点数加法溢出检测方法有下面() A.奇偶校验法 B.双符号位法 C.单符号位法 D.反码法 正确答案:B,C 题目解析: 判别溢出的两种方法: 方法一,采用双符号位法,也称为&quo ...

  2. 计算机组成原理补码加法证明,补码加减法运算(计算机组成原理).ppt

    <补码加减法运算(计算机组成原理).ppt>由会员分享,可在线阅读,更多相关<补码加减法运算(计算机组成原理).ppt(25页珍藏版)>请在皮匠网上搜索. 1.计算机组成原理2 ...

  3. 两个负数相减计算机如何表示,计算机如何表示整数

    [TOC] 在计算机中,任何的数据都是用二进制: 0 和 1 来表示.整数也不例外.生活中的 10,在 8 个字节的整数中表示为 00001010.但是这样子只能表示正数和零.怎么表示负数呢?于是有了 ...

  4. 计算机中整数加法满足结合律吗

    今天看<程序设计语言概念>(Concepts of Programming Language),第七章"结合性"一节中有这么一段: 某些计算机中的整数加法不具有结合性. ...

  5. 计算机组成原理、数字逻辑之加法器详解

    问题咨询及项目源码下载请加群: 群名:IT项目交流群 群号:245022761 一.加法器的意义 加法器是计算机中的基础硬件,了解加法器不仅能够揭开计算机的本质,也能对计算机的数制运算产生深刻的理解. ...

  6. JS加法函数,用来得到精确的加法结果(说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果)

    //加法函数,用来得到精确的加法结果 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果. //调用:accAdd(arg1,arg2) ...

  7. java 加法 溢出_java实现两个大数相加,可能出现溢出错误

    java实现两个大数相加,可能存在溢出,如123456789 + 987654321 返回 1111111110 用BigInteger 三行就完事啊. 不用这个类也可以实现 public BigIn ...

  8. Java黑皮书课后题第5章:5.2(重复加法)程序清单5-4产生了5个随机减法问题。改写该程序,使它产生10个随机加法问题,加数时两个1到15之间的整数。显示正确答案的个数和完成测试的时间

    5.2(重复加法)程序清单5-4产生了5个随机减法问题.改写该程序,使它产生10个随机加法问题,加数时两个1到15之间的整数.显示正确答案的个数和完成测试的时间 题目 题目概述 程序清单5-4 破题 ...

  9. 进制转换【最全进制转换汇总】(整数_小数_正数_负数)正负数整数小数十进制转任意进制-正负数整数小数任意进制转十进制-正负数低进制转高进制-正负数高进制转低进制

    文章目录: 补充知识点:各进制符号表示及其关系--二进制(B).八进制(O).十进制(D).十六进制(前缀OX,后缀H) 扩展:在线进制转换 第一部分:正数 一:[整数]正数十进制转任意进制:辗转相除 ...

最新文章

  1. Python 2.7终结于7个月后,这是你需要了解的3.X炫酷新特性
  2. vue处理json数据的原理_Vue解析json数据的渲染
  3. Ubuntu14.04 kylin 安装配置Tomcat7服务器
  4. 以高并发著称的 Go 如何与 MySQL 搭档应对千亿级数据?
  5. Master of GCD(差分数组||线段树)
  6. 前端学习(1345):用户的增删改查操作2
  7. 前端学习(534):多列布局1
  8. js导出的xlsx无法打开_js-xlsx 导出表格至excel
  9. mysql创建索引以及进程过程中出现的问题
  10. 【C语言】又是排序(指针专题)
  11. adobe出的cookbook
  12. 基于php的学校固定资产管理系统
  13. linux运维工程师做些什么-肤浅篇
  14. JavaWeb POI 导出Excel
  15. plc和服务器通讯协议,PLC实现HTTP协议的POST请求,与服务端JSON格式双向通讯
  16. C语言实现 掷骰子游戏
  17. Java内存模型知识点小结---《深入理解Java内存模型》(程晓明)读书总结
  18. python批量删除行_听说用python来批量删除说说也挺快乐的呢~
  19. 获取浏览器窗口高度和宽度兼容IE
  20. 4年Java经验面试总结(转)

热门文章

  1. Qt creator5.7 OpenCV249之图片旋转(含源码下载)
  2. C/C++ OpenCV方框滤波
  3. echarts 地图 dispatchaction不好使_数据分析帝:广东省客户数量地图展示,如何通过python实现?...
  4. 计算机指令要素,【计算机系统】CPU指令执行流程与指令流水线原理
  5. 0x02是什么意思_学习STM32时为什么要学习汇编?
  6. 计算机系数据结构03年试题答案,03年北京文考“数据结构”试题
  7. Appium python adb命令
  8. resultset需要关闭吗_Java程序员都需要懂的「反射」
  9. 使用map的find头文件_C++ map的基本操作和使用
  10. div生成图片_Vue生成分享海报(含二维码)