5.2.4_标志位的生成

简介: 计算机组成原理之标志位的生成

[toc]
这一小节,我们接着上一小节,来看标志位的生成,对上节课的加法器进行一个补充。

两个 n 比特的数相加,除了得到 n 比特的相加结果之外,加法器还可以输出 4 个标志的信息OF、SF、ZF、CF这四个标志位。
image.png

一、OF标志位

(1)介绍

首先来看OF这个标志位的含义,以及如何确定OF的值。

OF它的英文全称叫 Overflow Flag, Overflow就是溢出的意思。所以这个标志就是用于表示运算是否发生了溢出

如果溢出,OF 就是1;如果没有发生溢出,OF就是0。

需要注意的是,OF这个标志位仅在有符号数的加减运算当中有意义。

我们上节课说过,无论是有符号数的加减运算,还是无符号数的加减运算,在底层都是用同一套电路来实现的,所以无论是有符号数的加减,还是无符号数的加减,最终都会产生OF、SF、ZF、CF这 4 个标志位。

但是OF这个标志位只在有符号数的加减运算当中是有含义的。也就是说,如果现在进行的是无符号数的加减运算,即便OF这个出标志等于1,那也并不能说明无符号数发生了溢出。

所以,无符号数的加减运算是否产生了溢出,我们不看OF标志位,这个OF标志位的信息,只在有符号数加减运算的时候才有含义。

(2)硬件层面

搞清楚它的含义之后,接下来我们看OF标志位在硬件层面是如何确定的。

OF的确定规则是,通过最高位产生的进位与次高位产生的进位进行异或来确定

我们回到上一节提到的例子。
image.png

1.加法运算

首先来看加法运算
image.png

x 加 y ,就是1000 加上 0111 。进行加法的时候, Sub 这一位,也就是 Cin 这一位是 0 ,所以最后加上一个0。

对应的位相加, 0加1再加 0 等于 1,向更高位的进位是0。
image.png

接下来对应的这一位相加,0加1再加0最后等于1,向更高位产生的进位是0。
image.png

再往后的三位相加, 0 加1再加0等于1,向更高位产生的进位是0。
image.png

接下来最高的这一位,1加0再加刚才的进位 0 等于 1,最高位往更高位的进位应该是0。
image.png

OF的确定方式是,最高位产生的进位和次高位产生的进位进行异或

在我们刚才的运算当中,最高位产生的进位是0,而次高位产生的进位也是0,所以 OF就等于0异或上 0,0 和0异或还是等于 0 。

所以在补码的加法运算当中, OF等于0,也就意味着没有发生溢出,这个运算结果是正确的。

2.减法运算

接下来再来看减法运算。

x 减y,这个减法在背后做的事情就是x (1000) 加上y全部按位取反1000 ,末位再加上 Sub 减法信号信号 1 。

同样得,一位一位往上加。

0加0再加1,这一位等于1,往更高位的进位是 0。
image.png

0 加0再加0,这一位等于0,往更高位的进位是0;然后0加0再加0,这位的本位和是0,往更高位的进位也是0。最后一位 1加1 再加0,本位和就应该等于0,往更高位的进位就应该等于1。如下:
image.png

在减法运算当中, OF等于最高位产生的进位(1)和次高位产生的进位(0)进行异或, 1 和0异或等于1,这就说明产生了溢出
也就是运算结果是错误的,说明的是这样的信息。

通过这个例子,相信大家已经能够掌握 OF这一位的运算方式。什么叫最高位产生的进位,什么叫次高位产生的进位,要知道分别指的是什么东西。

3.注意

最后再次强调, OF这个标志位对于无符号数的加减法是没有意义的,并不能说明无符号数的加减法发生了溢出,只有在有符号数的加减运算当中,它可以说明是否发生了溢出。

通过上一节课我们强调的这两个例子,大家是能够感受出来的。
image.png

同样是刚才的 1000 加上0111。如果我们按照无符号数来对运算进行解释,在 x 加 y 的运算当中,同样的OF等于0,底层的计算逻辑是一样的。用最高位产生的进位和次高位产生的进位进行异或来确定OF的值。

x 加y,OF等于0;x 减y,OF等于1 ,底层的处理逻辑一样。

由于此时是无符号数的加减运算,因此在 x 减 y 的时候,OF等于 1 并不能说明它产生了溢出,这个结果依然是正确的。

所以结合上节课的两个例子,大家应该能够感受到 OF这一位应该怎么计算,以及需要注意哪些东西。

这是第一个标志位 OF的生成。

二、SF标志位

接下来第二个标志位SF,符号标志 Sign Flag。

如果运算结果是负的,那么置为1。如果运算结果是正的,那么置为0。

SF 的确定很简单,只需要取最高位的本位和就可以。

回到刚才我们说的这个例子,刚才我们在计算 x 减 y 的时候,会把这些对应的比特位依次相加,最高的这一位是 1 加 1再加0。

那么在这一位的本位和就是0,也就是最后输出的这 n 个比特的最高位是多少, SF 就是多少。
image.png

所以你像刚才 x 减 y 的这个例子当中, SF 的值就是0,也就意味着 x 减 y 得到的结果是一个正数

而 x 加 y 得到的值最高的这一位是1,所以SF这个标志位应该是等于1,表示这个运算得到的结果是一个负值。

所以 SF 标志位的确定很简单,只需要取运算结果的最高位就可以了。

需要注意的是, SF 同样只对有符号数的加减运算有意义,对于无符号数的加减运算是没有意义的。

因为无符号数没有正负这一说,所以这个标志位它表示的正负性对于无符号数而言就没有意义。

三、ZF标志位

接下来第三个标志位ZF

ZF的确定也很简单,如果运算的结果,这 n 个比特全部都是0,那么ZF就是1。

它的含义就是运算结果是否为0

ZF这个标志位,无论对有符号数还是对无符号数,都是有意义的

四、CF标志位

最后一个标志CF

这个标志叫做进位借位

发生进位借位的时候, CF 等于1,否则置为0

:question: 这个标志位怎么确定?

CF可以用最高位产生的进位和Sub,也就是加法/减法这个控制信号进行一个异或,当我们进行加法的时候, Sub 等于0;进行减法的时候, SUB 等于1。

需要强调的是,CF它只对无符号数的加减法有意义,对于有符号数的加减法是没有意义的。

回到无符号数加减法的例子。

如何确定 CF 标志位?CF是用最高位产生的进位,和 Sub 进行一个异或得到的

最高位产生的进位,其实就是我们上节课说到的Cout。然后 和Sub 信号进行异或,其实就是和 Cin进行一个异或。

当然你想把它写成 Sub 也可以,因为 Sub 和 Cin 本来就是一个东西。

来看一下第二个例子(图中例2)。
image.png

<1>加法

x 加 y 背后要做的事情就是 0011 加上0100。由于此时进行的是加法,所以最低位要加0。运算的结果应该是0111,最高位产生的进位应该等于0。
image.png

而此时进行的是加法,所以Sub这个信号等于0, 0 和0异或等于0。

这就说明在这个无符号数加法当中,没有产生往更高位的进位,也就意味着没有发生溢出

所以这个结果是正确的。
image.png

<2>减法

再来看减法运算背后做的事情。

0011 加上1011,末尾还要加1,因为Sub 等于 1 。
image.png

在这个减法运算当中, CF 应该等于最高位产生的进位0 ,然后和 Sub 信号进行异或。

此时是减法,所以 Sub 等于1,异或的结果就等于1。

这就说明在这个减法运算当中产生了借位,也就是被减数不够减,还需要往更高位借一位,这也意味着被减数要比减数更小,这才导致了减法运算发生了借位。

这也就意味着最终运算的结果肯定是错误的,发生了溢出

这就是最后一个标志位。用最高位产生的进位和Sub,也就是加减的控制信号进行异或来确定 CF 到底是多少。

当 CF 等于 1 的时候,说明无符号数的加减运算发生了进位或者借位,也就是发生了溢出。

五、总结回顾

image.png

无符号数的加减运算如何判断是否产生了溢出,你得看 CF 这一位。
而有符号数的加减运算是否发生了溢出,你得看OF这一位。

这也就解释了我们上一节课提到的这两个例子留下来的疑问,为什么同样的两个二进制进行相加,把它看作有符号数,就发生了溢出,但是把它看作无符号数,又没有发生溢出,大家可以自己验证一下。

在第一个例子的减法运算当中, OF这一位等于1,但是CF那一位等于0。所以如果是有符号数的减法运算,就会产生溢出;但如果我们把它看作无符号数的减法运算,CF等于0,就说明没有发生溢出。

这就是在加减运算当中确定 4 个标志位的方法,以及 4 个标志位的含义。

相关文章
|
9月前
|
人工智能 移动开发 机器人
智能体 | 快速构建专属英语口语陪练助手,这下雅思再也不用愁了
智能体是以云为基础、AI为核心的智能系统,不同于通义千问等AI工具,用户可自建专注于特定领域的智能体,如英语口语陪练助手。通过阿里云百炼平台,开通服务、创建智能体、选择模型、设计Prompt并测试优化,最终发布到多渠道。用户能随时随地进行英语口语练习,提升语言能力。
|
5月前
|
API 开发工具 开发者
HarmonyOS NEXT实战:拨打电话
本课程介绍如何在HarmonyOS SDK中使用Telephony Kit实现拨打电话功能。通过CallPhoneDemoPage示例,讲解如何输入电话号码并调用makeCall接口拨号,涉及call模块的使用及设备通话能力检测。
7860 0
|
4月前
|
存储 NoSQL Dubbo
Java主流分布式解决方案多场景设计与实战
本文介绍了Java领域的主流分布式技术,涵盖分布式服务框架(如Dubbo、Spring Cloud)、分布式数据存储(如Redis、MongoDB)、分布式锁(如ZooKeeper、Redisson)及分布式事务(如Seata、Hmily),并通过电商项目案例分析了这些技术在实际开发中的应用,帮助开发者应对高并发与大数据挑战。
240 0
|
存储 分布式计算 分布式数据库
【专栏】云计算与分布式系统架构在数字化时代的关键作用。云计算,凭借弹性、可扩展性和高可用性,提供便捷的计算环境
【4月更文挑战第27天】本文探讨了云计算与分布式系统架构在数字化时代的关键作用。云计算,凭借弹性、可扩展性和高可用性,提供便捷的计算环境;分布式系统架构则通过多计算机协同工作,实现任务并行和容错。两者相互依存,共同推动企业数字化转型、科技创新、公共服务升级及数字经济发展。虚拟化、分布式存储和计算、网络技术是其核心技术。未来,深化研究与应用这些技术将促进数字化时代的持续进步。
436 4
|
11月前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
1033 8
|
缓存 算法 网络协议
一文详细理解计算机网络 - 数据链路层(考试和面试必备)
这篇文章详细介绍了计算机网络中数据链路层的概念、基本问题、点对点信道和广播信道的数据链路协议(如PPP和CSMA/CD),以及局域网和以太网的相关知识。
2601 0
一文详细理解计算机网络 - 数据链路层(考试和面试必备)
|
网络协议 安全 Linux
Linux中无法连接互联网或局域网
【10月更文挑战第5天】
1767 3
|
测试技术
5.2.3_补码加减运算器
计算机组成原理之补码加减运算器
776 1
5.2.3_补码加减运算器
|
设计模式 Java C++
揭秘!JDK动态代理VS CGLIB:一场关于Java代理界的‘宫心计’,你站哪队?
【8月更文挑战第24天】Java 动态代理是一种设计模式,允许在不改动原类的基础上通过代理类扩展功能。主要实现方式包括 JDK 动态代理和 CGLIB。前者基于接口,利用反射机制在运行时创建代理类;后者采用继承方式并通过字节码技术生成子类实现类的代理。两者在实现机制、性能及适用场景上有明显差异。JDK 动态代理适用于有接口的场景,而 CGLIB 更适合代理未实现接口的类,尽管性能更优但存在一些限制。开发者可根据需求选择合适的代理方式。
583 0
|
编译器 开发工具 C语言
vscode安装+配置+使用+调试【保姆级教程】
vscode安装+配置+使用+调试【保姆级教程】
59118 9