C 语言中涉及的运算

  1. 按位运算:或运算(|)、与运算(&)、取反运算(~)、异或运算(^)
  2. 逻辑运算:或运算(||)、与运算(&&)、非运算(!)
  3. 移位运算:
    • 逻辑移位
    • 算术移位:右移高位补符号
  4. 位扩展和位截断运算
    • 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

定点数运算

无符号数和补码加减法运算

Compound addition

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

原码乘法运算

原码一位乘法

Unsigned multiplication Unsigned multiplication

补码乘法运算

Two’s complement multiplication Two’s complement multiplication

布斯(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
    直观含义:当 YiYi-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 串结束)
    000+0仍在 0 区间
    110+0仍在连续 1 串内部
  • 实现层面的操作步骤: 设初始部分积 [P0] = 0,附加位 Y-1 = 0。循环 n 次(i = 0, 1, …, n-1):

    1. 判断与加减:根据 (Yi, Yi-1) 的状态,部分积加上 [x]、加上 [-x] 或加 0。
    2. 移位:将(部分积、乘数 y、附加位 Y-1)作为一个整体,进行算术右移 1 位

以上推导展示了 Booth 乘法“把连续的 1 串压缩为两次边界操作(加 x 与减 x)”的本质,不仅减少了实际的加法次数,且天然适配补码的符号扩展与算术移位运算。

原码除法运算

符号位单独运算 定点整数,被除数扩展高位添加 0;定点小数,被除数扩展低位添加 0 Qn = 1 时,定点整数除法和定点小数除法均溢出,浮点数除外(可右规) Division

恢复余数除法

Division Division

不恢复余数除法

Division NoReset Division NoReset

补码除法运算

被除数需要进行符号扩展 Division Two’s complement rules

恢复余数除法

若被除数与除数同号,则 Q 中是真正的商;否则,将 Q 中的数值求补后作为真正的商 Division Two’s complement division with reset

不恢复余数除法

商的修正:最后一次 Q 寄存器左移一位,将最高位 Qn 移出,并在最低位置上商 Q0 余数的修正:若余数符号同被除数符号,则不需修正,余数在 R 中;否则,按下列规定进行修正:当被除数和除数符号相同时,最后余数加除数;否则,最后余数减除数

Division Two’s complement division with  no reset

浮点数运算的精度和舍入

保护位 G(警戒位):紧跟在有效位后面的第 1 位 舍入位 R :紧跟在有效位后面的第 2 位 粘位 S :后面所有位的“或”结果,即舍入右边只要有 1,粘位则置为 1

  1. 就近舍入到偶数
舍入规则:  
G=0 → 不进位  
G=1 且(R=1 或 S=1)→ 进位  
G=1 且 R=0 且 S=0 → 向偶数舍入
  1. +∞ 方向舍入
  2. -∞ 方向舍入
  3. 朝 0 方向舍入 Result rounding