添加二进制数的直接方法是使用一系列全加器。每个加法器将两位相加,输入一个进位位,并与求和位一起输出一个进位位。这是一种旧的、完善的数字设计,用于将二进制数解释为正整数。
在现实生活中,用全加器将二进制数相加是一个愚蠢的想法。需要时间,工程师称之为“传播时间”,从最低有效位 (LSB) 的进位位影响下一个位,并且该进位位影响下一个位,等等所有 20 或 32或64位或很多。存在巧妙的方法来规避这种延迟。无知是福;对于这个答案的其余部分,我们很乐意忽略这个工程细节。如果您好奇,请查看wikipedia article on look-ahead carry。
如何将负数表示为二进制?懒惰的方法(对于工程师)是考虑使用相同的全加器电路可以工作。将二进制解释为 2 的补码有符号数字非常有效。如果我们这样想,那么我们旧的仅正数算术逻辑单元就可以被掸掉,什么都没有改变,并用作有符号整数单元。
这很容易看出,需要一点思考。想想一个三位加法器。 001 + 010 => 011 和 101 + 001 => 110。对于二进制的纯正解释,这很好。对于已签名,101 和负三有什么关系?添加三个,并保留所有位。 1000就是答案。但是我们只使用了三位,所以它是 000,零。将“负”值视为相对于 1000,并且知道第 4 位只是想象的。
经过一番尝试,我们发现我们可以用 2 的补码添加负数,通过补码和递增找到。
问题是:如何减去 A-B?我们不会连接特定的电路来补充 B,增加 B,然后添加 A+B。太慢,太多的硅空间。事实证明,有一种方法可以调整全加器的设计以进行减法运算。注意:
A - B = A + (-B) = A + (~B) + 1
对全加器设计的“调整”是什么都不做,而是为 B 的每个位添加一个反相器。我们将一个始终开启的进位位推入 LSB 的全加器。完毕!生活很轻松。无论如何,对于数字工程师来说。
大多数 CPU 都有一个 NEG 操作码,正是为了执行 2 的补码求反。它被实现为减法,但“A”输入被关闭,因此它在 ALU 中显示为全零。
旧的 7400 系列 TTL 逻辑芯片有一个 4 位 ALU,即 74181。它可以加、减、AND、OR、XOR、移位或补全任何一个或两个 4 位二进制数。根据需要将它们解释为正数或带符号的 2 的补码。维基百科有一个article on this chip,附有逻辑图供您欣赏。
更令人困惑的是,虽然通常低电压(通常小于 1 伏左右)是布尔值零,而高电压(高于 3V 或任何取决于确切技术和芯片设计的电压)是布尔值 ONE,可以并且经常进行切换。工程师可能会选择 0.5V 可能是一,而 4V 是零。过去是 AND 门现在可以被认为是 OR 门。有时这允许使用更快的芯片。这与 NPN 晶体管的开关速度略快于 PNP 以及带有上拉电阻的集电极开路输出以及开路时自然为高的输入非常普遍有关。在逻辑电路的输入端添加一个按钮通常意味着一个上拉电阻器(或没有电阻器)和连接到接地电路节点的按钮。无推=对人“关”=高电压;按下按钮 =“on”或“active”到 Human = 零电压。我们希望将它们分别视为逻辑零和一。因此,您可能会发现一些 ALU 设计适用于这个疯狂的颠倒世界。