首页/计算机组成原理/02-data-representation/溢出判断方法 🔗 在 Obsidian 中打开
计算机组成原理 · 02-data-representation

溢出判断方法

重要度 ⭐⭐⭐⭐⭐补码运算溢出检测双符号位OF/CF
速查
只有同号数相加才可能溢出。三种判法:单符号位(同号相加结果变号 → 溢出);双符号位(01 正溢出 / 10 负溢出);进位法 $V = C_s \oplus C_1$(符号位进位 ⊕ 最高数值位进位)。溢出 OF 针对有符号数、进位 CF 针对无符号数。

什么是溢出

溢出(Overflow)是指运算结果超出了数据表示范围。只有两个同号数相加才可能产生溢出,异号数相加不可能溢出(结果范围缩小)。

注意溢出是针对有符号数的概念,无符号数溢出用进位/借位标志 CF 表示。

溢出判断的三种方法

2.1 一位符号位判断法(单符号位法)

规则:两个同号数相加,若结果符号与操作数符号不同,则溢出。

$$V = C_s \oplus C_1$$

其中 $C_s$ 是符号位的进位,$C_1$ 是最高数值位的进位。

  • $V = 0$:无溢出;$V = 1$:有溢出。

2.2 双符号位法(变形补码法)

用两位符号位:00 表示正,11 表示负。

规则:运算后两位符号位不同则溢出。

  • 01:正溢出(上溢)
  • 10:负溢出(下溢)
  • 0011:无溢出

$$V = S_{s1} \oplus S_{s2}$$

2.3 进位判断法

设符号位进位为 $C_s$,最高数值位进位为 $C_1$:

$$V = C_s \oplus C_1$$

  • $C_s = 0, C_1 = 1$:正溢出。
  • $C_s = 1, C_1 = 0$:负溢出。
  • $C_s = C_1$:无溢出。

手算示例

例 1:正溢出(+7 + +6)

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 → 正溢出)

例 2:负溢出(-6 + -7)

A = -6 = 1,010(补码)
B = -7 = 1,001(补码)
─────────────
   11,010
 + 11,001
─────────
  110,011 → 丢弃最高进位 → 10,011
符号位 = 10 → 负溢出!✓(-13 超出 [-8,+7])

例 3:无溢出(-3 + -2)

A = -3 = 1,101
B = -2 = 1,110
─────────────
   11,011
Cs=1(符号位有进位),C1=1(最高数值位有进位)
V = 1⊕1 = 0 → 无溢出 ✓(结果 -5 合法)

例 4:异号相加不可能溢出

A = +3 = 0,011
B = -2 = 1,110
─────────────
结果:   0,001 = +1 ✓

三种方法对比

方法判断依据优点缺点
单符号位同号相加结果异号简单直观需要分析操作数
双符号位两位符号不同直接看结果需要 2 位符号位
进位法$C_s \neq C_1$与加法器配合好需要知道进位

标志位设置(以 x86 为例)

标志位含义溢出时
OF溢出标志$OF=1$ 表示有符号溢出
CF进位标志$CF=1$ 表示无符号溢出/借位
SF符号标志运算结果的符号位
ZF零标志结果为 0 时置 1

记忆卡片

什么情况下可能产生溢出?
两个同号数相加。异号数相加不可能溢出。记忆:同号相加才危险(结果可能跳过零)。
进位法溢出判断公式?
$V = C_s \oplus C_1$(符号位进位 ⊕ 最高数值位进位)。记忆:两个进位不同就是溢出。
双符号位法中 01 和 10 分别表示?
01 = 正溢出(上溢),10 = 负溢出(下溢)。记忆:01→0 在 1 前 → 正溢出;10 反之。
溢出 OF 和进位 CF 的区别?
OF 针对有符号数,CF 针对无符号数;同一次运算两者可能不同。记忆:OF 看"符号对不对",CF 看"最高位有没有多出来的进位"。

交互动画 · 补码加法与溢出检测

4 位二进制列式(左 = 符号位,右 = 最低位) C1 位位2位1位0 C1(最高数值位进位)Cs(符号位进位) 进位 → A + B 结果 ···· 0000 0000 0000 竖虚线 = 符号位边界;进位行 · = 该列产生的进位,C1 列(左2)进位与 Cs 列(左1)进位不同即溢出。
选择算式,观察进位与三种判法结论
点击按钮开始

相关知识点

twos-complement-arithmetic fixed-and-floating-point

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。