对于我的计算机科学课,我需要完成一个项目,我迫切需要了解一个补码和二进制补码的逻辑。我已经知道如何构建这些以及硬件加法器在处理二进制补码时如何工作。困扰我并且需要帮助的事情是补码加法背后的逻辑。为什么我们必须将我们将结转的位(并在使用两个补码编码时丢弃)添加到总和以获得正确的结果?我不明白为什么二进制加法在添加一个补码时会表现得像这样,为什么最后添加的结转位如此重要。我需要了解它背后的逻辑。谢谢
1 回答
一个 1 的补码数(比如 16 位)可以描述如下 - 根据二进制代码c(即 0..0xFFFF,或 0..65535)与代码所代表的“值” x之间的关系, x在 -32767.. 32767 范围内。
- 如果值x为 0..32767,则代码c在数值上等于 x,因此 MSB 中为零
- 如果x为负值,-1 .. -32767,则c为 65535 - x,c的 MSB为 1。
- 代码c =65535 = 0xFFFF 被解释为零;因为它在 MSB 中有 1,所以我将其称为“-0”。
现在考虑使用二进制加法器添加两个代码时x值会发生什么:
如果x1和x2都是正数,则加法器将代码相加:c = c1 + c2。输入端的两个 MSB 都为零,因此不会有进位。所以c的值将是总和x1 + x2,这就是它的解释方式(假设总和不会溢出到 MSB 中)。
如果 x1和x2都是负数,那么通过添加c1 + c2您将添加 (65535+x1)+(65535+x2)。总会有结转;通过丢弃它,您最终会得到一个等于 65534+(x1+x2) 的二进制值。为了得到我们想要表示这个负和的代码,即 65535+(x1+x2),我们需要再加 1。
如果符号不同,则代码总和为 65535+(x1+x2)。可能有也可能没有结转。由于 MSB 不同,当且仅当和的 MSB 为零时才会发生进位。在真正的和 (x1+x2) < 0 的情况下,您不会有进位,并且值 65535+(x1+x2) 是 (x1+x2) 的正确代码。如果总和(x1+x2)>0,则有进位;代码的总和(丢弃进位后)将为(x1+x2)-1,因此您必须加 1 才能获得正确的代码(x1+x2)。
因此,查看所有情况,可以发现每当发生进位时(并且您通过丢弃它有效地减去 65536),您需要加 1 以获得表示总和的正确代码。
当 x1+x2 = 0 - 其中一个 <0 和另一个 >0 - 代码总和将始终为 65535,保持原样并被解释为零(“-0”)。
当两者都为零时,您有三种情况:
0 + 0 = 0 相当简单...
-0 + -0:代码加进进位后为0xFFFF + 0xFFFF = (carry+ 0xFFFE) = 0xFFFF,解释为-0。
-0+ 0:代码为 0xFFFF + 0 = 0xFFFF (-0)
因此,1 的补码和为“正确”0 的唯一情况是两个输入均为正确 0。所有其他加起来为零的情况给出“-0”。
从数学上讲,您可以说 1 的补码使用 (c = x) mod 65535,而c被限制为 0...0xFFFF。所以加法需要以 65535 为模。每次有结转时,减去 65536(从顶部丢弃)并加 1(通过在底部添加);由于您在此过程中减去 65535,因此保留了模 65535 的值。