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

2024-08-25 15:04

本文主要是介绍【计算机组成原理】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比特无符号数可以表示的合法范围。如果超出了合法范围,那么一定会发生溢出,否则就是没有溢出。好的,以上就是这个小节的全部内容。

这篇关于【计算机组成原理】2.2.3_2 无符号数的加减运算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1105883

相关文章

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操