Skip to content

408 计算机组成原理

408

计算机组成原理

CO-02-03 补码加减运算与溢出判断


一、定位信息

项目内容
所属圈层核心层
考点热度H级(高频重点) — 近5年真题中高频出现,选择题和综合应用题均有涉及,单次分值3–6分;溢出判断方法是常考重点
前置知识回顾需掌握补码的定义与表示方法(CO-02-02),理解原码、反码、补码之间的转换关系
知识网络定位本单元是定点数编码(CO-02-02)的直接应用,也是理解ALU运算器(CO-05-02)硬件设计的基础,溢出判断方法在浮点数运算(CO-02-06)中也会用到

二、知识点讲解

2.1 补码加法运算

核心公式

[A+B]=[A]+[B](mod2n+1)[A + B]_{\text{补}} = [A]_{\text{补}} + [B]_{\text{补}} \pmod{2^{n+1}}

即:两个数的补码之和等于两个数之和的补码。这意味着加法器可以直接对补码进行加法运算,无需判断符号,大大简化了硬件设计。

为什么补码可以将减法转为加法?

补码的本质是"模运算"。以钟表为例:当前时间是3点,要往回拨5小时(减5),等价于往前拨7小时(加7),因为 57(mod12)-5 \equiv 7 \pmod{12}。同理,在补码系统中:

[AB]=[A+(B)]=[A]+[B][A - B]_{\text{补}} = [A + (-B)]_{\text{补}} = [A]_{\text{补}} + [-B]_{\text{补}}

2.2 补码减法运算——由加法器实现

关键操作:求 [B][-B]_{\text{补}}

方法:将 [B][B]_{\text{补}} 连同符号位一起取反,末位加1

即:[B]=[B]+1[-B]_{\text{补}} = \overline{[B]_{\text{补}}} + 1X\overline{X} 表示逐位取反)

示例A=45A = 45B=23B = 23,字长8位,求 ABA - B

  1. [A]=00101101[A]_{\text{补}} = 00101101(45的二进制)
  2. [B]=00010111[B]_{\text{补}} = 00010111(23的二进制)
  3. [B]=11101000+1=11101001[-B]_{\text{补}} = 11101000 + 1 = 11101001
  4. [A]+[B]=00101101+11101001=00010110[A]_{\text{补}} + [-B]_{\text{补}} = 00101101 + 11101001 = 00010110(舍弃进位)
  5. 结果 00010110=221000010110 = 22_{10} ✓(4523=2245 - 23 = 22

硬件实现说明:在ALU中,减法通过一个取反器(对 BB 按位取反)和一个加1信号(将最低位进位设为1)来实现 B-B 的补码,然后复用加法器完成减法。这比设计独立的减法器更经济。

2.3 溢出的产生与判断

什么是溢出?

溢出是指运算结果超出了给定位数所能表示的范围。只有当两个同号数相加时才可能溢出(异号数相加不会溢出,因为结果的绝对值一定小于等于两个操作数中绝对值较大的那个)。

溢出的表现

  • 两个正数相加得到负数(正溢出)
  • 两个负数相加得到正数(负溢出)

三种溢出判断方法

方法一:单符号位法(根据操作数和结果的符号判断)

AsA_sBsB_s 为操作数的符号位,SsS_s 为结果的符号位。

溢出=AsBsSs+AsBsSs\text{溢出} = A_s \cdot B_s \cdot \overline{S_s} + \overline{A_s} \cdot \overline{B_s} \cdot S_s

即:

  • 正 + 正 = 负 → 溢出(As=0,Bs=0,Ss=1A_s = 0, B_s = 0, S_s = 1
  • 负 + 负 = 正 → 溢出(As=1,Bs=1,Ss=0A_s = 1, B_s = 1, S_s = 0

方法二:双符号位法(变形补码 / 模4补码)

用两位符号位 Ss1Ss2S_{s1} S_{s2}Ss1S_{s1} 为高位符号,Ss2S_{s2} 为低位符号,正常情况下 Ss1=Ss2S_{s1} = S_{s2}):

  • Ss1Ss2=00S_{s1} S_{s2} = 00:结果为正,无溢出
  • Ss1Ss2=01S_{s1} S_{s2} = 01:结果正溢出(上溢)
  • Ss1Ss2=10S_{s1} S_{s2} = 10:结果负溢出(下溢)
  • Ss1Ss2=11S_{s1} S_{s2} = 11:结果为负,无溢出

溢出判断V=Ss1Ss2V = S_{s1} \oplus S_{s2}(两位符号位异或),V=1V = 1 表示溢出。

方法三:进位判断法

设最高数值位的进位为 CnC_n,符号位的进位为 CsC_s(即从符号位向更高位的进位)。

V=CnCsV = C_n \oplus C_s

  • CnCsC_n \neq C_s(一个有进位,一个没有)→ 溢出
  • Cn=CsC_n = C_s(都有进位或都没有)→ 无溢出

示例(验证三种方法的一致性):字长4位(含1位符号位),A=+6=0110A = +6 = 0110B=+5=0101B = +5 = 0101

  0110  (+6)
+ 0101  (+5)
------
  1011  (-5?)  ← 符号位为1,但两个正数相加
  • 方法一As=0,Bs=0,Ss=1A_s = 0, B_s = 0, S_s = 1001=10 \cdot 0 \cdot 1 = 1溢出
  • 方法二:双符号位为 0110+0101=10110110 + 0101 = 1011,双符号位 0101正溢出
  • 方法三Cn=1C_n = 1(1+1进位),Cs=0C_s = 0(0+0无进位),CnCs=1C_n \oplus C_s = 1溢出

2.4 符号扩展

将一个较短的补码数扩展为较长的补码数时:

  • 正数:高位补0
  • 负数:高位补1

即"符号扩展"——用符号位填充所有新增的高位。

示例5-5 的4位补码 10111011 → 8位补码 1111101111111011

验证:1011=8+2+1=51011 = -8+2+1 = -511111011=128+64+32+16+8+2+1=511111011 = -128+64+32+16+8+2+1 = -5


三、记忆与理解辅助

3.1 口诀与技巧

  1. 补码加减口诀:"加法直接加,减法取反加一再相加,溢出符号异或查"
  2. 溢出判断速记
    • 单符号位:同号相加异号无("同号相加才可能溢出")
    • 双符号位:01正溢10负溢,00正数11负数("01上10下")
    • 进位法:最高位进位和符号位进位不同则溢出("进位不同就是溢")
  3. 符号扩展口诀:"正数补0,负数补1"——补的是符号位

3.2 对比表:三种溢出判断方法

方法判断条件优点缺点
单符号位法符号位运算结果异常直观,逻辑简单需要额外的判断电路
双符号位法V=Ss1Ss2V = S_{s1} \oplus S_{s2}判断电路最简单,还能区分正/负溢出需要多一位存储空间
进位判断法V=CnCsV = C_n \oplus C_s不需要额外存储位需要获取两个进位信号

3.3 补码加减运算完整流程图

输入:[A]补、[B]补、操作码OP(加/减)

  ├── OP为加法 → 直接计算 [A]补 + [B]补

  └── OP为减法 → 先求 [-B]补(取反+1)→ 再计算 [A]补 + [-B]补


得到 [S]补(含溢出检测)

  ├── 检测溢出(三种方法任选其一)
  │     ├── 无溢出 → [S]补 即为正确结果
  │     └── 有溢出 → 报告溢出异常

  └── 输出结果

四、例题与精解

例题1(基础巩固)

命题意图:考查补码减法的基本运算能力,验证"减法变加法"的掌握程度。

题目:设字长为8位,用补码计算 674367 - 43,并验证结果。

审题分析

  • 已知:A=67A = 67B=43B = 43,字长8位
  • 求解:674367 - 43 的补码运算过程
  • 关键:将减法转为加法,求 [43][-43]_{\text{补}}

解题思路

  1. [67][67]_{\text{补}}[43][43]_{\text{补}}
  2. [43][-43]_{\text{补}}
  3. 补码相加
  4. 验证结果

完整步骤

第一步67=64+2+1=01000011267 = 64 + 2 + 1 = 01000011_2[67]=01000011[67]_{\text{补}} = 01000011

第二步43=32+8+2+1=00101011243 = 32 + 8 + 2 + 1 = 00101011_2[43]=00101011[43]_{\text{补}} = 00101011

第三步:求 [43][-43]_{\text{补}}

  • [43]=00101011[43]_{\text{补}} = 00101011
  • 取反:1101010011010100
  • 加1:1101010111010101
  • [43]=11010101[-43]_{\text{补}} = 11010101

第四步:补码相加

  01000011  (+67的补码)
+ 11010101  (-43的补码)
----------
 100011000

舍弃最高位进位(模 282^8 运算),结果为 00011000=241000011000 = 24_{10} ✓(6743=2467 - 43 = 24

方法反思

  • 补码加法中产生的进位直接丢弃,这是模运算的正常行为
  • 不需要判断符号,不需要单独的减法器,这就是补码的核心优势
  • 实际硬件中,ALU的 subsub 信号控制是否对 BB 取反并置最低进位为1

例题2(中等提升)

命题意图:考查溢出的检测能力,要求使用多种方法判断溢出。

题目:设字长为8位,用补码计算 100+56100 + 56,判断是否溢出,并分别用三种方法验证。

审题分析

  • 已知:A=100A = 100B=56B = 56,字长8位
  • 求解:是否溢出,以及三种验证方法
  • 关键:8位补码表示范围为 [128,+127][-128, +127]100+56=156>127100 + 56 = 156 > 127,预期溢出

解题思路

  1. 求两个正数的补码
  2. 补码相加
  3. 用三种方法分别判断

完整步骤

第一步:编码

  • 100=64+32+4=011001002100 = 64 + 32 + 4 = 01100100_2[100]=01100100[100]_{\text{补}} = 01100100
  • 56=32+16+8=00111000256 = 32 + 16 + 8 = 00111000_2[56]=00111000[56]_{\text{补}} = 00111000

第二步:补码相加

  01100100  (+100)
+ 00111000  (+56)
----------
  10011100  (符号位为1!)

结果 1001110010011100:符号位为1,表示负数(10010-100_{10}),但两个正数相加不可能得负数 → 溢出!

第三步:三种方法验证

方法一:单符号位法

  • As=0A_s = 0(正),Bs=0B_s = 0(正),Ss=1S_s = 1(负)
  • As=0,Bs=0,Ss=1A_s = 0, B_s = 0, S_s = 1001=10 \cdot 0 \cdot 1 = 1溢出

方法二:双符号位法

  • 用双符号位:001100100+000111000=010011100001100100 + 000111000 = 010011100
  • 双符号位为 0101正溢出(上溢)

方法三:进位判断法

  • 最高数值位(第6位)的进位:Cn=1C_n = 1(第6位:1+1=101+1 = 10,有进位)
  • 符号位的进位:Cs=0C_s = 0(符号位:0+0=00+0 = 0,无进位)
  • V=CnCs=10=1V = C_n \oplus C_s = 1 \oplus 0 = 1溢出

三种方法结论一致:溢出

方法反思

  • 两个正数相加得到负数是溢出的典型信号
  • 三种方法从不同角度捕捉溢出:符号异常(方法一)、符号位不一致(方法二)、进位不匹配(方法三)
  • 硬件实现中,方法三(进位异或)最常用,因为它只需一个异或门

五、考情分析

分析维度具体情况
近5年考查频次高频,几乎每年至少出现1次,多以选择题或综合题子问形式出现
常见题型选择题(补码加减运算结果判断、溢出判断)、综合题(与ALU数据通路结合)
分值占比2–6分/次
命题趋势单纯计算题减少,更多与"数据通路""溢出标志位设置""标志寄存器"等硬件设计知识结合考查;有时与IEEE 754规格化过程中的溢出处理结合

:考情数据基于大纲权重与通用命题规律推测,待真题分析子代理产出后校准。


六、易错点提醒

易错点1

  • 错误表现:求 [B][-B]_{\text{补}} 时只对数值位取反加1,符号位不变
  • 错误原因:将"数值位取反"和"连同符号位一起取反"混淆
  • 正确做法[B][-B]_{\text{补}} 必须连同符号位一起取反,末位加1。符号位也要参与取反

易错点2

  • 错误表现:补码加法产生进位后忘记丢弃(保留了第9位或第n+1n+1位)
  • 错误原因:不理解模运算的含义——在 n+1n+1 位补码系统中,结果自动对 2n+12^{n+1} 取模
  • 正确做法:最高位的进位直接丢弃,这不影响结果的正确性

易错点3

  • 错误表现:认为"异号数相加也可能溢出"
  • 错误原因:没有从数学上理解溢出的本质——异号数相加,结果的绝对值必然小于等于两个操作数中绝对值较大者,不会超出表示范围
  • 正确做法:溢出只可能在同号数相加时发生。判断口诀:"同号相加才溢出"

易错点4

  • 错误表现:双符号位法中,将 01011010 的含义记反(把 0101 当作负溢出)
  • 错误原因:缺乏直觉理解
  • 正确做法0101 表示"应该是正数但符号位变成了1"→ 正溢出(上溢);1010 表示"应该是负数但高位符号变成了0"→ 负溢出(下溢)。口诀:"01上溢,10下溢"

七、来源标注

  • 依据2026考研统考大纲"计算机组成原理"第二章"数据的表示和运算"中"补码加减运算"和"溢出判断"相关内容
  • 依据大学本科经典教材共识(唐朔飞《计算机组成原理》、白中英《计算机组成原理》)

本知识单元为CO-02"数据的表示和运算"系列第3单元,下一单元将讲解定点数乘除运算。

考研全科复习资料 - 基于2026考研统考大纲