一个人的补充和两个补充逻辑背后

时间:2015-02-21 17:36:52

标签: binary complement

对于我的计算机科学课我需要完成一个项目,我迫切需要理解一个补语和二补的逻辑。我已经知道如何构建这些以及硬件加法器在处理二进制补码时的工作原理。困扰我和我需要帮助的事情是补充加法背后的逻辑。为什么我们必须将我们将要携带的位(并在使用两个补码编码时丢弃)添加到总和以获得正确的结果?我不明白为什么二进制加法在添加一个补码时表现得像这样,为什么最后添加进位比特如此重要。我需要理解它背后的逻辑。谢谢

1 个答案:

答案 0 :(得分:1)

1的补码(比如16位)可以描述如下 - 就二进制代码 c (即0..0xFFFF或0)之间的关系而言..65535)和'值'代码所代表的 x x 的范围是-32767 .. 32767。

  • 如果值 x 为0..32767,则代码 c 在数值上等于x,因此在MSB中为零
  • 如果值 x 为负,-1 ..-32767,则 c 为65535 - x ,并且< em> c 是1。
  • 代码 c = 65535 = 0xFFFF将被解释为零;因为它在MSB中有1,我会称之为&#39; -0&#39;。

现在考虑使用二进制加法器添加两个代码时 x 值会发生什么:

  • 如果 x1 x2 均为正数,则加法器会添加以下代码: c = c1 + c2 。两个MSB在输入端都为零,因此不会有进位。所以 c 的值将是总和 x1 + x2 ,这就是它的解释方式(假设总和不是&t;溢出到MSB)。

  • 如果 x1 x2 都是否定的,那么通过添加 c1 + c2 ,你是添加(65535 + x1)+(65535 + x2)。总会有一个结转;通过丢弃这个,你最终得到的二进制值等于65534+(x1 + x2)。为了得到我们想要代表这个负数的代码,即65535+(x1 + x2),我们需要再增加1个。

  • 如果符号不同,则代码总和为65535+(x1 + x2)。可能有也可能没有结转。由于MSB是不同的,所以当且仅当总和的MSB为零时才进行输出。在真和(x1 + x2)<1的情况下。 0,你没有进位,值65535+(x1 + x2)是(x1 + x2)的正确代码。如果和(x1 + x2)> 0,则会有进位;代码之和(丢弃执行后)将是(x1 + x2)-1,因此你必须加1才能获得正确的代码(x1 + x2)。

因此,考虑所有情况,可以确定每当发生结转时(并且通过丢弃它实际上减去65536),您需要加1以获得表示总和的正确代码。

当x1 + x2 = 0时 - 一个&lt; 0而另一个&gt; 0 - 代码总和将始终为65535,保持原样并将被解释为零(&#34; - 0&#34;。)

如果两者都为零,则有三种情况:

0 + 0 = 0相当简单......

-0 + -0:加入进位后代码为0xFFFF + 0xFFFF =(进位+ 0xFFFE)= 0xFFFF,解释为-0。

-0+ 0:代码为0xFFFF + 0 = 0xFFFF(-0)

因此唯一的情况是1的补码总和是“正确的”。 0表示两个输入都是正确的0.所有其他情况加起来为零会给出&#39; -0&#39;。

在数学上,你可以说1的补码使用(c = x)mod 65535,其中 c 约束为0 ... 0xFFFF。因此,需要以模数65535进行加法。每次进位时,减去65536(通过从顶部丢弃)并加1(通过在底部添加);因为在过程中减去65535,所以保留模65535值。