小熊奶糖(BearCandy)
小熊奶糖(BearCandy)
发布于 2026-11-03 / 1 阅读
0
0

计算机组成原理:补码加减法、CF与OF

一、补码减法的原理

计算机通常利用补码加法实现减法。

核心公式:[X−Y]补=[X]补+[−Y]补[X-Y]{\text{补}}=[X]{\text{补}}+[-Y]_{\text{补}}

计算步骤:

  1. 写出被减数和减数的机器码。

  2. 对减数的机器码按位取反,末位加1。

  3. 将得到的补码与被减数相加。

  4. 保留机器字长范围内的结果,最高位向外的进位用于判断标志位。

对于nn 位机器码:

X−Y≡X+Y‾+1(mod2n)X-Y\equiv X+\overline{Y}+1\pmod{2^n}

其中,$\overline{Y}$ 表示对nn 位机器码逐位取反。


二、CF:进位/借位标志

CF用于判断无符号数运算是否产生进位或借位。

1. 加法的CF

公式:CF=CnCF=C_n

  • Cn=1C_n=1:最高位向外产生进位,CF=1。

  • Cn=0C_n=0:最高位向外没有进位,CF=0。

例如,4位无符号加法:

     1111
   + 0001
   ------
    10000

最高位向外进位为1,因此CF=1CF=1。

2. 减法的CF

减法通过A+B‾+1A+\overline{B}+1 实现时:

公式:CF=Cn‾CF=\overline{C_n}

  • Cn=1C_n=1:没有借位,CF=0。

  • Cn=0C_n=0:发生借位,CF=1。

也可以直接比较两个无符号操作数:

  • 当A<BA<B 时,$CF=1$。

  • 当A≥BA\ge B 时,$CF=0$。

例如,4位计算3−73-7:

     0011
   + 1001
   ------
     1100

其中10011001 是01110111 取反加1的结果。

最高位向外进位为0,所以:

CF=0‾=1CF=\overline{0}=1

说明发生借位。


三、OF:溢出标志

OF用于判断有符号数运算是否超出补码表示范围。

nn 位补码表示范围:

−2n−1≤X≤2n−1−1-2^{n-1}\le X\le 2^{n-1}-1

例如,4位补码范围为−8≤X≤7-8\le X\le7。

1. OF的电路判断公式

公式:OF=Cn⊕Cn−1OF=C_n\oplus C_{n-1}

其中:

  • CnC_n:符号位向外产生的进位。

  • Cn−1C_{n-1}:进入符号位的进位。

  • ⊕\oplus:异或运算。

CnC_n

Cn−1C_{n-1}

OF

0

0

0

0

1

1

1

0

1

1

1

0

因此:

  • Cn=Cn−1C_n=C_{n-1} 时,$OF=0$。

  • Cn≠Cn−1C_n\ne C_{n-1} 时,$OF=1$。

记忆:两个进位相同不溢出,不同则溢出。

2. 为什么OF使用异或?

补码的最高位是符号位。

符号位的全加器计算公式:

Sn−1=An−1⊕Bn−1⊕Cn−1S_{n-1}=A_{n-1}\oplus B_{n-1}\oplus C_{n-1}

符号位向外的进位:

Cn=An−1Bn−1+(An−1⊕Bn−1)Cn−1C_n=A_{n-1}B_{n-1}+(A_{n-1}\oplus B_{n-1})C_{n-1}

其中乘法表示逻辑与,加法表示逻辑或。

当两个正数相加却得到负数,或者两个负数相加却得到正数时,说明发生溢出。

这种情况恰好对应Cn≠Cn−1C_n\ne C_{n-1}。

因此:

OF=Cn⊕Cn−1OF=C_n\oplus C_{n-1}

3. OF计算示例

计算4位补码:$7+3=10$。

      0111
    + 0011
    ------
      1010

逐位计算:

  • 第0位:$1+1=10$,产生进位1。

  • 第1位:$1+1+1=11$,产生进位1。

  • 第2位:$1+0+1=10$,产生进位1。

  • 第3位:$0+0+1=1$,不产生进位。

因此:

C3=1,C4=0C_3=1,\quad C_4=0

代入公式:

OF=C4⊕C3=0⊕1=1OF=C_4\oplus C_3=0\oplus1=1

因为10>710>7,超出了4位补码的最大值,因此发生溢出。

4. OF的符号判断法

加法:

  • 正数 + 正数,结果为负数:OF=1。

  • 负数 + 负数,结果为正数:OF=1。

  • 异号数相加:OF=0。

减法:

  • 正数 − 负数,结果为负数:OF=1。

  • 负数 − 正数,结果为正数:OF=1。

  • 同号数相减:OF=0。

对于减法A−BA-B,还可以使用符号位公式:

OF=(As⊕Bs)∧(As⊕Ss)OF=(A_s\oplus B_s)\land(A_s\oplus S_s)

其中:

  • AsA_s:被减数符号位。

  • BsB_s:减数符号位。

  • SsS_s:结果符号位。

  • ∧\land:逻辑与。


四、CF与OF的区别

项目

CF

OF

名称

进位/借位标志

溢出标志

判断对象

无符号数

有符号数

加法公式

CF=CnCF=C_n

OF=Cn⊕Cn−1OF=C_n\oplus C_{n-1}

减法公式

CF=Cn‾CF=\overline{C_n}

OF=Cn⊕Cn−1OF=C_n\oplus C_{n-1}

判断依据

最高位进位或借位

符号位前后的进位

注意:CF和OF相互独立,不能通过一个标志位推断另一个。


五、第31题完整解题

已知32位机器字长:

  • R1=FFFFFFFFHR1=\mathrm{FFFFFFFFH}

  • R2=FFFFFFF0HR2=\mathrm{FFFFFFF0H}

执行减法:$R3=R1-R2$。

第一步:减数取反加1

减数: FFFFFFF0
取反: 0000000F
加1 : 00000010

因此:

[−R2]补=00000010H[-R2]_{\text{补}}=\mathrm{00000010H}

第二步:进行补码加法

       FFFFFFFF
     + 00000010
     ----------
      10000000F

保留低32位:

R3=0000000FHR3=\mathrm{0000000FH}

第三步:判断CF

最高位向外产生进位:

C32=1C_{32}=1

减法借位标志:

CF=C32‾=1‾=0CF=\overline{C_{32}}=\overline{1}=0

因此 CF=0,没有借位。

第四步:判断OF

进入符号位的进位:

C31=1C_{31}=1

离开符号位的进位:

C32=1C_{32}=1

代入公式:

OF=C32⊕C31=1⊕1=0OF=C_{32}\oplus C_{31}=1\oplus1=0

也可以用十进制验证:

−1−(−16)=15-1-(-16)=15

结果没有超出32位补码表示范围,因此没有溢出。

最终答案:A,CF=0,OF=0。


六、考试速记公式

1. 补码减法

[X−Y]补=[X]补+[−Y]补[X-Y]{\text{补}}=[X]{\text{补}}+[-Y]_{\text{补}}

2. 加法CF

CF=CnCF=C_n

3. 减法CF

CF=Cn‾CF=\overline{C_n}

4. 加减法OF

OF=Cn⊕Cn−1OF=C_n\oplus C_{n-1}

5. OF符号判断(加法)

OF=As⊕Bs‾∧(As⊕Ss)OF=\overline{A_s\oplus B_s}\land(A_s\oplus S_s)

6. OF符号判断(减法)

OF=(As⊕Bs)∧(As⊕Ss)OF=(A_s\oplus B_s)\land(A_s\oplus S_s)


七、最终总结

CF:看无符号数

  • 加法:有进位为1。

  • 减法:有借位为1。

  • 补码减法通过加法器实现时,CF等于最高位向外进位取反。

OF:看有符号数

  • 电路法:$OF=C_n\oplus C_{n-1}$。

  • 符号法:加法同号相加结果异号则溢出;减法异号相减结果符号与被减数不同则溢出。

一句话记忆:CF判断无符号进位/借位,OF判断有符号溢出。

注:减法CF采用“CF=1表示借位”的常见约定,不同处理器体系结构可能有所不同。


评论