溢出判别
818 字
4 分钟
溢出判别
溢出判别
什么是溢出?
补码加减运算的结果超出了给定位数能表示的范围。溢出只对带符号数有意义——无符号数超出范围叫”进位/借位”(看 CF),不叫溢出。
溢出发生的四种情况
仅有以下四种情况会产生溢出:
| # | 运算 | 说明 |
|---|---|---|
| ① | 正数 + 正数 = 负数 | 两个正数相加,结果符号位变 1 |
| ② | 负数 + 负数 = 正数 | 两个负数相加,结果符号位变 0 |
| ③ | 正数 − 负数 = 负数 | 正数减负数,结果符号位变 1 |
| ④ | 负数 − 正数 = 正数 | 负数减正数,结果符号位变 0 |
①和②互为镜像(加法溢出),③和④互为镜像(减法溢出)。
溢出判别方法
方法一:采用一位符号位 + 进位判断
设 (= )为符号位的进位,(= )为最高数据位的进位:
| 溢出? | ||
|---|---|---|
| 0 | 0 | 无溢出 |
| 0 | 1 | 溢出 |
| 1 | 0 | 溢出 |
| 1 | 1 | 无溢出 |
逻辑表达式:
两个进位相同时无溢出,不同时溢出。这是硬件最简单的实现方式。
方法二:双符号位法
给结果设置两个符号位 和 ,(最高位)代表真正的符号。
| 含义 | |
|---|---|
00 | 结果为正数,无溢出 |
01 | 正溢出(两个正数相加溢出) |
10 | 负溢出(两个负数相加溢出) |
11 | 结果为负数,无溢出 |
判断规则:两个符号位相同则无溢出,不同则有溢出。
两种方法本质等价——双符号位中的 就是单符号位法中的 。
溢出逻辑表达式
设 、 分别为两个操作数的符号位, 为结果的符号位:
| V | 场景 | |||
|---|---|---|---|---|
| 0 | 0 | 1 | 1 | 正 + 正 = 负 |
| 1 | 1 | 0 | 1 | 负 + 负 = 正 |
- 第一项 :两正相加得负 → 正溢出
- 第二项 :两负相加得正 → 负溢出
- 时表示溢出
其他组合(正+负、负+正)理论上有 ,不会产生溢出。
原码乘法
算法原理
n 位原码乘法:被乘数 ,乘数 。符号位单独处理(异或),数值部分按绝对值做无符号乘法。
核心循环:重复 n 轮「判断 + 加法 + 右移」:
| Y 的最低位 | 操作 |
|---|---|
| 1 | 加上被乘数,右移 |
| 0 | 加上 0,右移 |
寄存器与流程
使用三个寄存器:乘积寄存器 P、乘数寄存器 Y、进位位 C。
C │ P │ Y ───┼────────────┼────────── 0 │ 0000 │ 1011 ← 初始状态(X = 0.1101, Y = 0.1011)每一轮:
- 判断 Y 的最低位
- 加法 P = P + (判断结果)
- 右移 {C, P, Y} 整体右移一位,Y 移出的位丢弃,P 的 LSB 进入 Y 的 MSB
示例
, ,求 。
符号:(结果为负)。
数值部分(4 位无符号乘法,做 4 轮):
| 轮次 | C | P | Y | 操作 |
|---|---|---|---|---|
| 初始 | 0 | 0000 | 1011 | — |
| 1 | 0 | 1101 | 1011 | Y最低=1,+X(=1101) |
| 0 | 0110 | 1101 | 右移 | |
| 2 | 0 | 0011 | 0110 | Y最低=1,+X |
| 0 | 1001 | 1011 | 右移 | |
| 3 | 0 | 0100 | 1101 | Y最低=0,+0 |
| 0 | 0010 | 0110 | 右移 | |
| 4 | 0 | 1111 | 0110 | Y最低=1,+X |
| 0 | 0111 | 1011 | 右移 ← 结束 |
结果:符号位 = 1,数值 = 0.0111 1011。
每次「判断+加法」后都要把部分积更新到 P 中再做「右移」。完成 n 轮后算法结束。



