溢出判别

818 字
4 分钟
溢出判别

溢出判别#

什么是溢出?#

补码加减运算的结果超出了给定位数能表示的范围。溢出只对带符号数有意义——无符号数超出范围叫”进位/借位”(看 CF),不叫溢出。


溢出发生的四种情况#

仅有以下四种情况会产生溢出:

#运算说明
正数 + 正数 = 负数两个正数相加,结果符号位变 1
负数 + 负数 = 正数两个负数相加,结果符号位变 0
正数 − 负数 = 负数正数减负数,结果符号位变 1
负数 − 正数 = 正数负数减正数,结果符号位变 0

①和②互为镜像(加法溢出),③和④互为镜像(减法溢出)。


溢出判别方法#

方法一:采用一位符号位 + 进位判断#

CsC_s(= CnC_n)为符号位的进位,C1C_1(= Cn1C_{n-1})为最高数据位的进位:

CsC_sC1C_1溢出?
00无溢出
01溢出
10溢出
11无溢出

逻辑表达式

OF=CsC1=CnCn1OF = C_s \oplus C_1 = C_n \oplus C_{n-1}

两个进位相同时无溢出,不同时溢出。这是硬件最简单的实现方式。


方法二:双符号位法#

给结果设置两个符号位 Ss1S_{s1}Ss2S_{s2}Ss1S_{s1}(最高位)代表真正的符号。

Ss1Ss2S_{s1}S_{s2}含义
00结果为正数,无溢出
01正溢出(两个正数相加溢出)
10负溢出(两个负数相加溢出)
11结果为负数,无溢出

判断规则:两个符号位相同则无溢出,不同则有溢出。

两种方法本质等价——双符号位中的 Ss2S_{s2} 就是单符号位法中的 C1C_1


溢出逻辑表达式#

AsA_sBsB_s 分别为两个操作数的符号位,SsS_s 为结果的符号位:

V=AsBsSˉs+AˉsBˉsSsV = A_s \cdot B_s \cdot \bar{S}_s + \bar{A}_s \cdot \bar{B}_s \cdot S_s
AsA_sBsB_sSsS_sV场景
0011正 + 正 = 负
1101负 + 负 = 正
  • 第一项 AsBsSˉsA_s B_s \bar{S}_s:两正相加得负 → 正溢出
  • 第二项 AˉsBˉsSs\bar{A}_s \bar{B}_s S_s:两负相加得正 → 负溢出
  • V=1V = 1 时表示溢出

其他组合(正+负、负+正)理论上有 V=0V=0,不会产生溢出。


原码乘法#

算法原理#

n 位原码乘法:被乘数 XX,乘数 YY。符号位单独处理(异或),数值部分按绝对值做无符号乘法。

核心循环:重复 n 轮「判断 + 加法 + 右移」:

Y 的最低位操作
1加上被乘数,右移
0加上 0,右移

寄存器与流程#

使用三个寄存器:乘积寄存器 P、乘数寄存器 Y、进位位 C。

C │ P │ Y
───┼────────────┼──────────
0 │ 0000 │ 1011 ← 初始状态(X = 0.1101, Y = 0.1011)

每一轮:

  1. 判断 Y 的最低位
  2. 加法 P = P + (判断结果)
  3. 右移 {C, P, Y} 整体右移一位,Y 移出的位丢弃,P 的 LSB 进入 Y 的 MSB

示例#

X=0.1101X = -0.1101, Y=0.1011Y = 0.1011,求 X×YX \times Y

符号XsYs=10=1X_s \oplus Y_s = 1 \oplus 0 = 1(结果为负)。

数值部分(4 位无符号乘法,做 4 轮):

轮次CPY操作
初始000001011
1011011011Y最低=1,+X(=1101)
001101101右移
2000110110Y最低=1,+X
010011011右移
3001001101Y最低=0,+0
000100110右移
4011110110Y最低=1,+X
001111011右移 ← 结束

结果:符号位 = 1,数值 = 0.0111 1011

X×Y=0.10001111X \times Y = -0.10001111

每次「判断+加法」后都要把部分积更新到 P 中再做「右移」。完成 n 轮后算法结束。

溢出判别
https://dongyanzhang.com/posts/计算机组成原理/溢出判别/
作者
阿东阿言
发布于
2026-07-14
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
阿东阿言
I share my notes | projects | experience here...
公告
欢迎来到阿东阿言的博客
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
25
分类
3
标签
5
总字数
11,186
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
v1.0.0
文章许可
CC BY-NC-SA 4.0