溢出(Overflow)是指运算结果超出了数据表示范围。只有两个同号数相加才可能产生溢出,异号数相加不可能溢出(结果范围缩小)。
规则:两个同号数相加,若结果符号与操作数符号不同,则溢出。
$$V = C_s \oplus C_1$$
其中 $C_s$ 是符号位的进位,$C_1$ 是最高数值位的进位。
用两位符号位:00 表示正,11 表示负。
规则:运算后两位符号位不同则溢出。
01:正溢出(上溢)10:负溢出(下溢)00 或 11:无溢出$$V = S_{s1} \oplus S_{s2}$$
设符号位进位为 $C_s$,最高数值位进位为 $C_1$:
$$V = C_s \oplus C_1$$
A = +7 = 0,111 B = +6 = 0,110 ───────────── 结果: 1,101 = -3(错误!) Cs=0(符号位进位),C1=1(最高数值位进位) V = 0⊕1 = 1 → 溢出 ✓(双符号位法:00,111 + 00,110 = 01,101 → 正溢出)
A = -6 = 1,010(补码) B = -7 = 1,001(补码) ───────────── 11,010 + 11,001 ───────── 110,011 → 丢弃最高进位 → 10,011 符号位 = 10 → 负溢出!✓(-13 超出 [-8,+7])
A = -3 = 1,101 B = -2 = 1,110 ───────────── 11,011 Cs=1(符号位有进位),C1=1(最高数值位有进位) V = 1⊕1 = 0 → 无溢出 ✓(结果 -5 合法)
A = +3 = 0,011 B = -2 = 1,110 ───────────── 结果: 0,001 = +1 ✓
| 方法 | 判断依据 | 优点 | 缺点 |
|---|---|---|---|
| 单符号位 | 同号相加结果异号 | 简单直观 | 需要分析操作数 |
| 双符号位 | 两位符号不同 | 直接看结果 | 需要 2 位符号位 |
| 进位法 | $C_s \neq C_1$ | 与加法器配合好 | 需要知道进位 |
| 标志位 | 含义 | 溢出时 |
|---|---|---|
| OF | 溢出标志 | $OF=1$ 表示有符号溢出 |
| CF | 进位标志 | $CF=1$ 表示无符号溢出/借位 |
| SF | 符号标志 | 运算结果的符号位 |
| ZF | 零标志 | 结果为 0 时置 1 |
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。