C 语言中涉及的运算
- 按位运算:或运算(|)、与运算(&)、取反运算(~)、异或运算(^)
- 逻辑运算:或运算(||)、与运算(&&)、非运算(!)
- 移位运算:
- 逻辑移位
- 算术移位:右移高位补符号
- 位扩展和位截断运算
- 0 扩展
- 符号扩展
带标志加法器
- 溢出标志 OF(Overflow Flag) :
OF = Cn ⊕ Cn-1 - 符号标志 SF(Sign Flag) :
SF = Fn-1 - 零号标志 ZF(Zero Flag) :ZF = 1,当且仅当 F = 0
- 进位/借位标志 CF(Carry Flag) :
CF = Cout ⊕ Cin
定点数运算
无符号数和补码加减法运算

Y 即 Y 各位取反
CF = Cin ⊕ Cout,CF 对于补码加减法运算无实际意义
- 无符号数(X 和 Y 就是 x 和 y 的二进制表示)
- 加法 :
X + Y, Cin = 0 - 减法 :
X + Y + 1, Cin = 1
- 加法 :
- 补码(X 和 Y 就是 x 和 y 的补码表示)
- 加法 :
X + Y, Cin = 0 - 减法 :
X + Y + 1, Cin = 1
- 加法 :
原码乘法运算
原码一位乘法

补码乘法运算

布斯(Booth)乘法推导(补码乘法的核心思想)
A. D. Booth 提出了一种补码相乘算法:符号位与数值位合在一起参与运算,正数与负数同等对待,直接得到补码形式的乘积,称为布斯(Booth)乘法。下面以 n 位补码定点整数来说明其推导思路。
设两个
n位补码定点整数:[x]补 = Xn-1 Xn-2 … X1 X0[y]补 = Yn-1 Yn-2 … Y1 Y0
根据补码定义,乘数y的真值可写成:y = -Yn-1 · 2n-1 + Σi=0n-2 Yi · 2i将
y改写为“相邻两位之差”的形式(这是 Booth 算法的关键): 利用Yi · 2i = Yi · 2i+1 - Yi · 2i,并令Y-1 = 0(在最低位右侧附加一位 0),可推得:y = Σi=0n-1 (Yi-1 - Yi) · 2i
直观含义:当Yi与Yi-1相同(00 或 11)时,该位对系数为 0;当出现跳变时,系数为 +1(01 跳变)或 -1(10 跳变)。因而乘积可写成:
x × y = Σi=0n-1 (Yi-1 - Yi) · x · 2i
这说明:只要判断乘数中每一位Yi与其低一位Yi-1的关系,就能决定在第i步对部分积是“加x”、“减x”还是“加 0”,再配合移位完成累加。递推规则与 Booth 判别式: 由
(Yi, Yi-1)决定本步加/减操作:(Yi, Yi-1)Yi-1 - Yi操作 含义 01 +1 +[x]补遇到 0→1 跳变(连续 1 串开始) 10 -1 +[-x]补遇到 1→0 跳变(连续 1 串结束) 00 0 +0仍在 0 区间 11 0 +0仍在连续 1 串内部 实现层面的操作步骤: 设初始部分积
[P0]补 = 0,附加位Y-1 = 0。循环n次(i = 0, 1, …, n-1):- 判断与加减:根据
(Yi, Yi-1)的状态,部分积加上[x]补、加上[-x]补或加 0。 - 移位:将(部分积、乘数
y、附加位Y-1)作为一个整体,进行算术右移 1 位。
- 判断与加减:根据
以上推导展示了 Booth 乘法“把连续的 1 串压缩为两次边界操作(加 x 与减 x)”的本质,不仅减少了实际的加法次数,且天然适配补码的符号扩展与算术移位运算。
原码除法运算
符号位单独运算 定点整数,被除数扩展高位添加 0;定点小数,被除数扩展低位添加 0
Qn = 1时,定点整数除法和定点小数除法均溢出,浮点数除外(可右规)
恢复余数除法

不恢复余数除法

补码除法运算
被除数需要进行符号扩展
恢复余数除法
若被除数与除数同号,则 Q 中是真正的商;否则,将 Q 中的数值求补后作为真正的商
不恢复余数除法
商的修正:最后一次 Q 寄存器左移一位,将最高位
Qn移出,并在最低位置上商Q0余数的修正:若余数符号同被除数符号,则不需修正,余数在 R 中;否则,按下列规定进行修正:当被除数和除数符号相同时,最后余数加除数;否则,最后余数减除数

浮点数运算的精度和舍入
保护位 G(警戒位):紧跟在有效位后面的第 1 位 舍入位 R :紧跟在有效位后面的第 2 位 粘位 S :后面所有位的“或”结果,即舍入右边只要有 1,粘位则置为 1
- 就近舍入到偶数
舍入规则:
G=0 → 不进位
G=1 且(R=1 或 S=1)→ 进位
G=1 且 R=0 且 S=0 → 向偶数舍入
- 朝
+∞方向舍入 - 朝
-∞方向舍入 - 朝 0 方向舍入



