当前位置: 首页 > news >正文

【计算机组成原理】2.2.3_2 无符号数的加减运算

2.2.3_2 无符号数的加减运算

00:00

各位同学大家好,在这个视频中我们会探讨无符号数的加减运算用计算机是怎么实现的。在王道书当中重点探讨了有符号数补码的加减运算怎么实现。对于无符号数的加减运算,王道书当中并没有深入的探讨。所以这个视频是对王道书的一个补充。大家可以参考这个视频配套的课件,在这个视频中我们首先会探讨无符号数的加减运算如何实现,其次我们还要关注无符号数加减运算的溢出判断。

00:38

好,首先我们回顾一下带符号数的加减运算是怎么实现的。在计算机内部所有的带符号数在进行加减运算之前,一定会先转换成补码的形式,用补码来进行加和减。补码的加法运算很简单,我们只需要从第低位到高位逐位的相加,就可以得到最终的一个加和结果。进行补码加法的时候,符号位是正常参与运算的。好,这是带符号数补码的加法。

01:15

那再复习一下带符号数补码的减法,也很简单,A减B等价于A加上负B,基于补码的特性,我们要根据B的补码求出负B的补码。很简单,只需要把B的补码全部位按位取反,末位加一就可以。用这样的方法得到负B的补码之后,A减B这个减法运算就可以转变成A加上负B,这两个运算是等价的,那这样我们就把减法转变成了与之等价的加法运算。加法运算规则刚刚说过,从最低位开始逐位相加,并且更低位有可能向更高位产生进位。符号位同样参与运算就可以。好,这就是补码的减法运算。

02:11

接下来我们要探讨无符号数的加法和减法运算。事实上底层的运算规则和带符号数的加法减法是一模一样的。来看这样的一个例子,A和B分别是99和9,它们对应的二进制分别是这样的两个数。我们把它扩展为8比特的无符号数。接下来运算A加上B加法运算,很简单,和补码是一样的,那从最低位开始依次往前,相应的这些比特位相加就可以得到A加B的一个结果。99加9应该等于108,用8比特的无符号数表示就刚好是这样的一个值。那不熟悉的同学可以暂停来验算一下。

03:02

好,这是加法运算规则,很简单,接下来看无符号数的减法运算计算机是怎么实现的。对于计算机硬件来说,无符号数的减法和带符号数补码的减法运算处理的逻辑是一样的。A是被减数,B是减数。那计算机的做法是首先把减数B全部位按位取反,末位加1,用这样的方式得到减数B的补数。那这个处理逻辑是不是和补码的减法是一模一样的,对减数B进行这样的处理之后,就可以把减法转变成与之等价的加法。接下来按位相加就可以。好,来解释一下为什么这么做,可以把减法转变成等价的加法。

03:59

之前我们介绍过补数的概念。对于8比特的无符号数来说,由于8比特的寄存器只能表示0到255这个范围的值,因此8比特寄存器天然的实现了模256这样的一个运算,也就是模2的8次方。那么在模256这个条件之下,B的补数应该等于多少呢?之前我们介绍过补数的定义,在模256的情况下,B和B的补数相加应该刚好等于256。那B的值等于9,9,加上247刚好等于256,因此247就是B在模256的条件下它的一个补数,所以A减B等价于A加上B的一个补数,也就是等价于A加上247。

05:11

那刚才我们说把B全部位按位取反,末位加1,经过这样的处理就可以得到B的补数。为什么这么做可以得到B的补数呢?好,首先我们看第一步,把B全部位按位取反,我们把B全部为按位取反,得到的这个数记为C,那么显然B加上C刚好等于八个1,也就是等于255。那如果在B加C的基础上再加一个一,那刚好就可以等于256。而刚才我们说B的补数加上B刚好等于模数256,因此C加上一这个值和B刚好就是互补的关系,所以C加1就是B的一个补数。

06:11

那还记得C怎么来的吗?C是把B全部位按位取反,对吧?因此把B全部位按位取反,末位再加上一个一,刚好就可以得到B的一个补数。这样的话我们就可以用A加上B的补数去等价A减B的一个效果。所以接下来减法运算就变成了加法运算。我们只需要按加法的规则,从最低位开始逐位相加,并且注意向更高位产生进位,逐步的往前加就可以,最终就可以得到A减B的运算结果,等于90,大家可以自己验证一下。

06:56

好,因此可以看到无符号数的减法运算,计算机的处理方法和有符号数补码的减法运算是一模一样的。首先把减数全部位按位取反,末位加一得到减数的补数,然后把减法转变成等价的加法。再回来看一下刚才提到的带符号数补码的减法运算,一模一样对吧?把减数全部位按位取反,末位加1,这样就可以把减法转变成等价的加法,逐位的相加就可以。好,因此对于计算机底层的硬件来说,无符号数的加法运算和带符号数补码的加法运算实现的逻辑是一样的,同样的无符号数的减法运算和带符号数补码的减法运算实现的逻辑也是一样的。

07:56

接下来我们还需要探讨无符号数的加减法运算怎么去判断溢出。首先介绍一种手算判断溢出的方法。在考试当中有可能会让你判断两个无符号数的加法或者减法是否发生溢出。那么手算判断的方法很简单,首先需要确定无符号数总共有多少个比特,N个比特无符号数可以表示的范围就是0到2的N次方减1,比如8比特无符号数,它的表示范围就是0到255。

08:31

如果题目让你判断某一个加法或者减法是否发生溢出,大家只需要用十进制带进去算一下就可以。比如说两个八比特无符号数,127减掉128会不会发生溢出呢?显然是会发生溢出的,因为这个相减的值等于负一,而负一已经超出了0到255这个范围,因此两个八比特无符号相减,127减128肯定会发生溢出。那类似的两个8比特无符号数,200加上100,最终手算的结果等于300,那300已经超出了0到255这个范围,所以两个8比特无符号数相加,200加100肯定也会发生溢出。好,所以考试的时候你可以带入十进制的值,用手算的方式去判断这个无符号数的加减法有没有发生溢出。重点关注无符号数的合法表示范围就可以。

09:38

好,这是考试做题的一个小技巧。对于计算机硬件来说,判断溢出的方法就不一样了。当两个无符号数进行加法运算的时候,我们说两个无符号数会从最低位开始逐位相加,从最低位加到最高位。那最高位相加之后有可能会产生进位。如果进位等于一,那么就说明发生了溢出,否则说明没有溢出。

10:07

好,来看加法发生溢出的例子,两个8比特无符号数A和B分别等于99和157,那这两个数相加正确的值应该是256,但是对于8比特无符号数来说,它的合法表示范围应该是0到255,所以这个加法运算肯定会发生溢出。那对于计算机硬件来说,它会逐位的进行相加,一加一等位等于0,往更高位进一,第二位本位和等于零往更高位进一,第三位本位和等于零往更高位进一,第四位同样本位和等于零往更高位进一,那接下来的每一位都是本位和等于零往更高位进一个,一直到最高的这一位,本位和等于0加1再加上来自更低位的进位一,那本位和等于零往更高位再进一个一。所以由于最高这一位往更高位产生了一个进位一,因此可以判断这个加法运算发生了溢出,那这就是计算机硬件判断无符号数加法是否发生溢出的一个逻辑。

11:30

再回到之前这个例子,99加上9等于108,在这个例子当中,加法运算并没有发生溢出,大家可以自己从最低位往最高位依次相加,自己验证一下,最高位向更高位的进位应该是等于0,在这种情况下说明加法运算没有发生溢出。好,这就是无符号数加法运算判断溢出的逻辑,关注最高位产生的进位是否等于1,等于1就发生溢出,不等于1就没有溢出。

12:05

好,接下来再看无符号数减法判断溢出的逻辑。之前我们说过,无符号数的减法最终肯定会被转变成与之等价的加法运算。那么转变成等价的加法运算之后,判断溢出的方法同样是要关注最高位产生的进位。当最高位产生的进位等于0的时候,说明发生溢出,否则没有溢出。好,来看一个减法发生溢出的例子,A等于99,B等于100两个数相减正确的值应该等于-1,肯定没办法用8比特的无符号数来表,所以这个减法运算一定会发生溢出,这是我们手算判断的逻辑。

12:52

对于计算机来说,这个减法运算它首先会把减数B全部位按位取反,末尾加一得到减数B的补数。接下来减法变加法逐位的相加。逐位相加的过程我们这儿就不再赘述,大家可以自己验证一下。最高位相加之后,往更高位产生的进位应该等于0,刚刚我们说在减法运算当中,如果最高位向更高位产生的进位等于0的时候,说明发生溢出,此时得到的这八比特运算结果是错误的。好,这是减法发生溢出的例子。

13:38

现在我们再回到前面这个没有发生溢出的例子,A等于99,B等于9,两个数相减A减B正确的值应该是90,那显然90没有超过8比特无符号数可以表示的合法范围,所以我们手算判断这个减法运算肯定没有发生溢出。那对于计算机来说,首先它会把减数B全部位按位取反,末位加一得到B的补数,然后减法变加法,从最低位开始逐位相加,直到加到最高高位。大家可以自己手算验证一下,最高位相加之后会往更高位产生一个进位一。刚刚我们说在减法运算当中,如果最高位产生的进位等于一,那么说明这个减法运算没有发生溢出。好,这就是计算机判断无符号数减法是否溢出的一个逻辑。

14:40

好的,在这个视频中我们介绍了无符号数加减运算的实现原理以及判断溢出的方法。我们需要重点关注无符号数减法的实现原理,对于计算机硬件来说,无符号数的减法和有符号数补码的减法实现的原理是一模一样的,都是让被减数不变,让减数全部位按位取反,末位加1,然后减法变加法,

15:10

好,另外我们介绍了无符号数加减运算判断溢出的逻辑。当进行加法运算的时候,需要关注最高位产生的进位是否等于1,如果等于1,那么说明发生溢出,否则没有溢出。而无符号数的减法运算判断溢出的逻辑刚好相反,当最高位产生的进位等于0的时候,说明发生溢出,否则没有溢出。

15:39

在这个视频中我们也介绍了手算判断溢出的方法。在考试当中判断两个N比特无符号数是否发生溢出,我们可以直接代入十进制数去计算一下,两个数相加或者相减是否超出了这N比特无符号数可以表示的合法范围。如果超出了合法范围,那么一定会发生溢出,否则就是没有溢出。好的,以上就是这个小节的全部内容。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 制造业企业如何选择适合自己的MES系统
  • 【Midjourney】Midjourney全面开放网站版,所有用户每天可免费生成25次
  • 【虚拟机安装与部署系列(二)】:文件传输工具WinSCP安装并连通VMware虚拟机
  • 关于计算机“如何从键盘输入,实现各种功能”的猜想,或者说是01代码的自己的理解,胡诌
  • EmguCV学习笔记 VB.Net 6.4 霍夫变换
  • 2024 实训室建设:1+X 老年生活照护实训室
  • 实用工具:[TrafficMonitor]任务栏电脑性能监控安装指南
  • x-cmd mod | x scoop - Windows 开源包管理工具
  • 【自动驾驶】控制算法(三)轮胎侧偏与车辆动力学模型
  • Prettier+Vscode setting提高前端开发效率
  • 单片机使用cJSON的坑
  • Spring的bean的生命周期
  • 深度学习100问6-什么是向量降维
  • 游戏开发设计模式之命令模式
  • Mysql语句性能优化
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • JS数组方法汇总
  • passportjs 源码分析
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Spring Cloud Feign的两种使用姿势
  • Spring核心 Bean的高级装配
  • Vue官网教程学习过程中值得记录的一些事情
  • 闭包--闭包作用之保存(一)
  • 从0到1:PostCSS 插件开发最佳实践
  • 从零开始的无人驾驶 1
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 基于组件的设计工作流与界面抽象
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 聊聊directory traversal attack
  • 前嗅ForeSpider采集配置界面介绍
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 思否第一天
  • 探索 JS 中的模块化
  • 写给高年级小学生看的《Bash 指南》
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 怎么把视频里的音乐提取出来
  • 栈实现走出迷宫(C++)
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #HarmonyOS:Web组件的使用
  • $$$$GB2312-80区位编码表$$$$
  • $().each和$.each的区别
  • $.ajax()参数及用法
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (php伪随机数生成)[GWCTF 2019]枯燥的抽奖
  • (ros//EnvironmentVariables)ros环境变量
  • (笔记)M1使用hombrew安装qemu
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音