考虑两个或三个位,然后了解这些东西可以扩展到 32 或 64 或许多位。
首先,让我们从十进制开始
99
+22
===
为了做到这一点,我们将进行一些“随身携带”。
11
99
+22
===
121
9加2是1进1,1加9加2是2进1……
重点是要注意要添加两个数字,我实际上需要三行,至少其中一些我可能需要能够添加三个数字。与 alu 中的加法器相同,每列或位通道,单个位加法器,需要能够将两个输入和一个进位相加,输出是一位结果和一位进位。
由于您使用了 5 和 2,让我们做一些 4 位二进制数学
0101
+0010
=====
0111
我们不需要继续这个,但你可以看到数学是有效的,5 + 2 = 7。
如果我们想添加 5 和 -2
11
0101
+1110
=====
0011
正如预期的那样,答案是 3,这并不奇怪,但我们有一个执行。而且由于这是一个带有负数的加法,所以它都可以工作,所以没有 if 符号位,所以我们不在乎只为加法器提供两个操作数。
现在如果你想做出细微的差别,如果你想从 5 中减去 2,你选择减法指令而不是加法。好吧,我们都知道,在二进制补码中取反意味着反转和加一。我们在上面看到,一个两输入加法器确实需要第三个输入来进行进位,以便它可以级联到加法器需要的宽度。因此,与其进行两次加法运算,不如将反转和加 1 作为第一个加法,真正的加法我们所要做的就是反转并设置进位:
了解没有减法逻辑,它会添加您提供的任何内容的负数。
v this bit is normally zero, for a subtract we set this carry in bit
11 11
0101 five
+1101 ones complement of 2
=====
0011
你知道吗,我们得到了相同的答案……这两个操作数的实际值是什么并不重要。如果是加法运算,则在进位位上放置一个零并将其馈送到加法器。如果它是减法运算,则将第二个操作数取反并在进位上放一个并将其馈送到同一个加法器。掉出来的东西都会掉出来。如果您的逻辑有足够的位来保存结果,那么一切正常,如果您没有足够的空间,那么您就会溢出。
溢出有两种,无符号和有符号。无符号很简单,它是进位位。有符号溢出与比较 msbit 列上的进位位与该列的进位位有关。对于我们上面的数学,您会看到该 msbit 列的进位和进位是相同的,两者都是一个。我们碰巧通过检查知道 4 位系统有足够的空间来正确表示数字 +5、-2 和 +3。4 位系统可以表示 +7 到 -8 的数字。因此,如果您要添加 5 和 5 或 -6 和 -3,您将得到有符号溢出。
01 1
0101
+0101
=====
1010
了解 SAME 加法逻辑用于有符号和无符号数学,这取决于您的代码,而不是虚拟定义这些位是否被视为二进制补码有符号或无符号的逻辑。
对于上面的 5 + 5 情况,您会看到 msbit 列上的进位是 1,但进位是 0,这意味着 V 标志(有符号溢出标志)将由逻辑设置。同时,该位的进位,即 C 标志的进位标志,将不会被设置。当考虑无符号 4 位可以容纳数字 0 到 15 时,因此 5 + 5 = 10 不会溢出。但是当考虑有符号的 4 位可以容纳 +7 到 -8 并且 5 + 5 = 10 是有符号溢出时,因此设置了 V 标志。
如果/当您有带进位指令的加法时,它们采用相同的加法器电路,而不是将进位输入零,而是输入进位标志。同样,借位减法,根据状态寄存器中进位标志的状态,进位不是 1,而是进位是 1 或 0。
乘法完全是另一回事,二进制使乘法比使用十进制数学更容易,但你必须有不同的无符号和有符号乘法指令。除法是它自己独立的野兽,这就是为什么大多数指令集没有除法。由于它烧毁的门或时钟的数量,许多没有乘法。