Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

减法器

复习

  • 全加器:全加器能处理低位进位,可串联构成多位加法器
  • 有符号数与原码:原码用符号位表示正负;反码需要回卷进位参与运算,且仍有两个零
  • 补码:补码是反码加 1,能统一加减法且只有一个零

TL;DR

  • A - B 就是 A + (-B),减去一个数,等于加上它的相反数
  • 让 B 按位取反,再把最低位进位设为 1,加法器就能完成减法
  • 一根控制线,就能让同一套电路在加法和减法之间来回切换

正文

  我们已经绕了两章的远路,先去认识负数,又折腾出补码。现在终于可以回过头,回答当初那个问题:加法器到底能不能做减法?

  先别急着另造一套减法电路。回忆上一章的结论:5 - 2 和 5 + (-2) 其实是一回事。而在补码里,-2 已经被表示成 1110。那就不妨直接把两个数交给加法器试试:

  0101   (+5)
+ 1110   (-2)
------
1 0011

  4 位机器只保留低 4 位,结果是 0011,也就是 3。原来的加法器一根线都不用改,减法已经算出来了。

  所以,减法器并不需要从头另造,它只是加法器的一种用法。 前面花两章理解补码,回报就在这里。

把“先变负数”也交给电路

  不过,现在还留着一个尾巴:得由人先把 2 改写成 -2 的补码,也就是“按位取反再加 1”。这活儿机器理应自己干。

  我们先做两件小事,再让它们合体:

  • 取反:把 B 的每一位反过来。异或门正好能充当一个“受控制的取反器”——B XOR 0 = B,B XOR 1 = NOT B。
    • 忘记了异或门?请返回《常见复杂逻辑门》
  • 加一:加法器本来就有一个最低位进位输入,把它设成 1,就等于加一。

  于是给电路加一根控制线,叫作 SUB:

  • SUB = 0:做加法。B 原样进入加法器,最低位进位也是 0。
  • SUB = 1:做减法。B 的每一位与 1 异或,从而取反;最低位进位设为 1。

  这样,真正送进加法器的其实是:

A + (B XOR SUB) + SUB

  代进去看看:SUB = 0 时,它是 A + B;SUB = 1 时,它是 A + NOT B + 1,也就是 A + (-B),也就是 A - B。

  一根控制线,就让同一台机器学会了两种运算。比起另造一整套减法电路,这省事得多。

举个例子

  令 A = 0110(6),B = 0011(3),来算一次减法:

  • SUB = 1,所以 B 先按位取反:0011 → 1100
  • 最低位进位也设为 1
  • 加法器计算 0110 + 1100 + 1 = 1 0011

  丢掉最高位,得到 0011,也就是 3。6 - 3 = 3,正确。要是把 SUB 拨回 0,同一套电路立刻又变回加法器。

思考题 1

  在 4 位电路中,若 A = 0110、B = 0011,做减法时真正送进加法器的第二个数和最低位进位分别是什么?结果是多少?

最高位进位

  你大概已经注意到那个被丢掉的最高位进位。它只是这次加法器额外产生的一位,并不自动等于“溢出“:6 - 3 的结果 0011 明明装得下,仍然会产生它。

  对无符号减法,这一位可以用来判断有没有借位;对有符号数,是否溢出要另看符号位。后面我们会给这些情况各自装上一盏指示灯,就是 ALU 的状态标识。

把运算装进一个盒子

  现在,机器会加,也会减。更早造出的与门、或门、异或门还能完成逻辑运算,但它们仍然散落在桌面上。每换一种运算就重新接线,显然还不够像一台真正的计算机。

  下一章,我们把这些常用运算统统装进同一个盒子,再用控制信号决定这一次到底算哪一种。

思考题 2

  减法器复用了加法器。如果反过来,让你只用减法器去实现加法,可行吗?大概要怎么做?

小结

知识点

  • 减法可以转化为补码加法
  • 异或门可以受控制地决定是否取反
  • 加减法器的统一表达式是 A + (B XOR SUB) + SUB
  • 超出位宽的进位就是溢出,含义随无符号/有符号而定

参考资料

  1. Wikipedia(zh):补码:用补码把减法转化为加法
  2. Wikipedia(zh):加法器:加法器的结构与进位

思考题答案(仅供参考)

思考题 1

  SUB = 1,所以 B 先按位取反为 1100。送进加法器的第二个数实际上就是这个 1100。最低位进位因为等于 SUB,所以进位为 1。所以加法器计算的实际上是 0110 + 1100 + 1 = 1 0011,丢掉最高位后得到 0011,即 3。

思考题 2

  可行。加法和减法本就靠 SUB 这根线切换,把逻辑反过来即可:默认 SUB = 1(做减法),需要加法时再把它拨到 0。本质上加减是同一个电路的两面,并没有谁更“基础”。谁作为默认,只是设计上的方便问题。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪