计算机组成原理笔记(十七)——4.2定点加减运算
定点数的加减运算包括原码、补码和反码3种带符号数的加减运算,其中补码加减运算实现起来最方便。
4.2.1原码加减运算
原码加减运算详解
原码是计算机中表示数值的基本方式之一,其特点为最高位为符号位(0表正,1表负),其余位为数值的绝对值。
一、运算规则
-
整体逻辑
- 先判断操作数符号和运算类型(加减),再分情况处理绝对值。
- 符号相同的数值相加或不同符号的数值相减时,需调整操作顺序以避免复杂判断。
- 最终结果的符号需根据运算类型和数值比较确定。
-
具体规则
- 符号位不参与数值运算,仅反映正负。
- 加法运算:
- 同号:绝对值相加,符号保持不变。
- 异号:绝对值相减,符号取决于绝对值较大者。
- 减法运算:
- 转化为加法: A − B = A + ( − B ) A - B = A + (-B) A−B=A+(−B),即取 B B B的相反数符号后相加。
二、运算步骤
以原码加法为例(减法类似):
-
符号判断:
- 同符号:绝对值直接相加,符号沿用操作数符号。
- 不同符号(实际为绝对值相减):
- 比较两数的绝对值大小。
- 大数减小数,结果符号与大数一致。
-
溢出处理:
- 若计算结果超出当前数据范围,需进行溢出处理(右移或扩展位数)。
-
结果规格化:
- 对尾数进行左/右移操作,保证数值最高有效位非零。
三、示例解析
例1:5(0101) + 3(0011)
十进制 原码二进制(四位)5 0 1013 0 011
-----------------
加法:绝对值相加 → 5+3=8,结果未溢出 → 0 1000(需扩展位数处理)
但四位原码最大值为7(0 111),溢出需右移尾数并调整阶码。
例2:5(0101) − 3(0011)
转化为加法:5 + (-3)
1. 取反:-3的原码为1 011
2. 比较符号不同,绝对值操作:5-3=2 → 结果符号为+ → 0 010
四、运算流程图
五、硬件实现与原码局限性
-
硬件逻辑:
- 需单独处理符号位、绝对值比较和运算控制。
- 较多逻辑门电路用于比较和符号判断,复杂度高。
-
原码的局限性:
- 零的表示不唯一(+0和−0)。
- 加减法需多次逻辑判断,效率低于补码。
- 现代计算机普遍采用补码,原码主要用于理论学习和特定场景。
4.2.2补码加减运算
一、补码加减运算核心规则
公式定义:
- 加法:[𝑋+𝑌]_{补} = [𝑋]_补 + [𝑌]_补
- 减法:[𝑋−𝑌]_{补} = [𝑋]_补 + [−𝑌]_补
(减法转换为加法)
核心操作:
- 求补操作:对减数𝑌进行补码转换:
[−𝑌]_补 = [𝑌]_补 逐位取反(包括符号位)后+1
示例:
[𝑌]_补 = 0 0011 ⇒ 取反 ⇒ 1 1100 ⇒ 加1 ⇒ [−𝑌]_补 = 1 1101
二、运算流程
三、溢出检测方法
-
单符号位法:
- 判断规则:当两个同符号数相加,结果符号相反时为溢出
示例:
正 + 正 = 负 ⇒ 上溢;负 + 负 = 正 ⇒ 下溢
- 判断规则:当两个同符号数相加,结果符号相反时为溢出
-
双符号位(变形补码):
- 编码方式:00 正常正数 / 11 正常负数
- 溢出模式:
- 同符号叠加后:01(正溢出)或10(负溢出)
示例:00 + 00 = 00(正常),01(溢出)
- 同符号叠加后:01(正溢出)或10(负溢出)
-
进位判断法:
- 逻辑表达式:溢出 = 最高符号位进位 ⊕ 次高位进位
示例:Cₙ(符号位进位)与Cₙ₋₁(数值最高位进位)异或为1时溢出
- 逻辑表达式:溢出 = 最高符号位进位 ⊕ 次高位进位
四、实例分析
例1:𝑋=+6(0110),𝑌=−3(1101补码)
计算𝑋+𝑌:
0 1 1 0 (6补码)
+ 1 1 0 1 (-3补码)
-----------(1)0 0 1 1 → 最高位溢出舍去 → 真值=+3 (0011)
例2:𝑋=+127(01111111),𝑌=+1→溢出
0 1111111 (127补码)
+ 0 0000001 (1补码)
---------------1 0000000 → 符号位变1→溢出(结果-128错误)
五、硬件实现原理
逻辑电路图:控制信号根据加减选择是否对Y取反加1
六、表格总结补码加减关键点
运算类型 | 补码转换操作 | 溢出条件 | 硬件指令控制 |
---|---|---|---|
A+B | 直接取补码相加 | 符号突变 / 变形补码为01或10 | 加法信号 |
A−B | B取反+1后与A相加 | 同上 | 减法信号使能取反 |
七、总结
补码加减通过统一运算逻辑简化设计,符号位直接参与计算无需额外处理。溢出需通过双符号位或进位标志及时检测,确保运算结果准确。硬件实现通过多路选择器和加法器高效完成正负数统一处理。
4.2.3补码的溢出判断与检测方法
一、溢出产生的原因
在补码加减运算中,溢出指运算结果超出了补码所能表示的范围,导致结果错误。溢出仅在以下两种情况下发生:
- 同符号数相加:两正数相加得负数(正溢),或两负数相加得正数(负溢)。
- 符号相同的数相减:本质转化为加法后可能导致溢出。
示例(假设8位补码):
- 正溢出:0111 1111(127) + 0000 0001(1) = 1000 0000(-128)→ 符号位突变
- 负溢出:1000 0000(-128) + 1000 0001(-127) = 0000 0001(1)→ 符号位突变
二、溢出检测方法
1. 单符号位法
逻辑表达式:
OVR = X s ⋅ Y s ⋅ S s ‾ + X s ‾ ⋅ Y s ‾ ⋅ S s \text{OVR} = X_s \cdot Y_s \cdot \overline{S_s} + \overline{X_s} \cdot \overline{Y_s} \cdot S_s OVR=Xs⋅Ys⋅Ss+Xs⋅Ys⋅Ss
其中 X s , Y s X_s, Y_s Xs,Ys 为操作数符号位, S s S_s Ss 为结果符号位。
检测逻辑:
- 两个同符号数相加,结果的符号位与原操作数符号位不同时为溢出。
逻辑图:
2. 进位判断法
逻辑表达式:
OVR = C s ⊕ C 1 \text{OVR} = C_s \oplus C_1 OVR=Cs⊕C1
- C s C_s Cs:符号位产生的进位
- C 1 C_1 C1:最高数值位(次高位)产生的进位
检测逻辑:
若两符号位进位与次高位进位不同,则溢出。
逻辑图:
3. 双符号位(变形补码)
规则:
- 双符号位 S 1 S 2 S_1S_2 S1S2:
00
:正常正数;11
:正常负数01
:正溢出;10
:负溢出
逻辑表达式:
OVR = S 1 ⊕ S 2 \text{OVR} = S_1 \oplus S_2 OVR=S1⊕S2
检测逻辑:
若运算结果的双符号位不同,则表示溢出。
硬件实现(溢出判断仅需异或门):
三、对比与流程
方法 | 逻辑复杂度 | 硬件开销 | 适用场景 |
---|---|---|---|
单符号位法 | 中等 | 中等 | 通用逻辑设计 |
进位判断法 | 低 | 低 | 快速并行运算 |
双符号位法(变形补码) | 高 | 高(扩展位数) | 精确控制(如浮点运算) |
溢出检测流程图:
四、硬件实现示例
补码加减运算电路框图:
五、关键点总结
- 溢出仅发生在同符号操作:异号数加减不会溢出。
- 单符号位法侧重结果符号突变,双符号位通过冗余符号位检测溢出。
- 硬件优化:双符号位增加芯片面积但简化判定逻辑;进位判断法适合高速运算。
4.2.4补码定点加减运算的实现
一、基本原理
补码加减运算的核心思想是:通过补码表示将减法转换为加法,统一使用加法器完成运算。其关键点包括:
- 符号位参与运算:符号位与数值位共同参与运算,结果直接为补码形式。
- 减法转加法:
[X-Y]补 = [X]补 + [-Y]补
,需通过“变补”操作得到[-Y]补
。 - 溢出判断:需检测运算结果是否超出机器能表示的范围。
二、实现电路结构
典型补码加减运算电路如图4-3所示(简化版):
组件说明:
- 并行加法器F:完成补码加法运算。
- 寄存器X/Y:存储操作数及结果。
- 控制信号:选择加法或减法模式(通过多路选择器实现变补)。
- 溢出检测逻辑:通过双符号位或进位链判断溢出。
三、运算步骤(以n位补码为例)
1. 加法运算
-
输入:
[X]补
和[Y]补
。 -
操作:直接相加,符号位参与运算。
-
输出:
[X+Y]补
。 -
示例:
[X]补 = 0.1011 (5), [Y]补 = 1.0110 (-6) [X+Y]补 = 0.1011 + 1.0110 = 1.0001 (-5) ✅
2. 减法运算
-
输入:
[X]补
和[Y]补
。 -
操作:将
Y
变补为[-Y]补
,再与X
相加。- 变补步骤:
- 对
[Y]补
按位取反(包括符号位)。 - 末位加1。
- 对
- 变补步骤:
-
输出:
[X-Y]补
。 -
示例:
[X]补 = 0.1011 (5), [Y]补 = 1.0110 (-6) [-Y]补 = 0.1010 (6) [X-Y]补 = 0.1011 + 0.1010 = 1.0101 (-1) ❌(实际应为11,此处需注意进位丢失)
四、溢出判断
补码运算可能产生溢出(结果超出表示范围),需通过以下方法检测:
1. 双符号位法
-
规则:运算结果的双符号位不同表示溢出。
01
:正溢出(结果过大)。10
:负溢出(结果过小)。
-
示例:
[X]补 = 01.1000 (120), [Y]补 = 01.0100 (120) [X+Y]补 = 10.1100 → 双符号位为 `10` → 负溢出 ❌
2. 进位链判别法
-
规则:最高位进位
C_n
与次高位进位C_{n-1}
异或结果为1时溢出。C_n ⊕ C_{n-1} = 1
→ 溢出。
-
示例:
加法器进位链:C_3 C_2 C_1 C_01 0 1 1C_n=1, C_{n-1}=0 → 1⊕0=1 → 溢出 ❌
五、时序与延迟分析
补码加减运算的延迟主要由进位链决定。以4级先行进位加法器为例:
- 组内进位:第1小组(C1~C3)延迟
2ty
。 - 组间进位:CLA电路生成C4~C16需
2ty
。 - 总延迟:最长路径为
6ty
(如图4-7)。
六、关键电路设计
1. 变补电路
- 功能:将
[Y]补
转换为[-Y]补
。 - 实现:对位取反 + 末位加1。
2. 多路选择器控制
- 功能:根据操作类型(加/减)选择输入信号。
- 逻辑:
七、总结
补码加减运算通过统一加法器实现加减操作,核心在于:
- 变补操作:将减法转换为加法。
- 溢出检测:双符号位或进位链判别法。
- 硬件简化:无需单独设计减法器,降低成本