【问题标题】:How does a computer calculate 2 values that are in two's complement exactly?计算机如何准确计算两个补码中的 2 个值?
【发布时间】:2017-02-19 02:25:08
【问题描述】:

我知道如何转换为二进制补码。你有二进制数,把它取反,然后加1。

但是计算机是做什么的呢?

假设我们想做D = A-B

AB 都是二进制补码。

计算机现在会添加这两个值吗?所以实际上是A + B

我希望我没有把我的问题描述得太糟糕/太复杂。请告诉我这让我很困惑!

【问题讨论】:

  • @Bathsheba 谢谢你的链接!我举了我自己的例子:A 和 B 都是 2-补码。 A=0110 和 B=1010。我们被要求做 A-B,所以我们将有: 0110 - 0101 = 0001 ?所以基本上我们取A并用B的否定减去它?对吗?
  • 嗯,还是我们宁愿取 0110 + 1010?因为两者都已经在两个补码中。好的,这越来越令人困惑......
  • 2-补码只是一种表示。它可以表示正数和负数。你上面描述的过程(反转一个数字,然后加 1)实际上是一个否定一个数字的过程(它不是一个数字到它的 2 补码的转换)。所以为了计算 AB,你用否定 B上述过程并将其添加到 A.

标签: math binary cpu processor twos-complement


【解决方案1】:

Nico 的评论已经很好地总结了这一点。

Two 的补码定义了如何将整数(在给定范围内)转换为位模式。它适用于正数(转换为直接二进制数系统,因此与无符号或反码表示相同)和负数(二进制补码的特定解释变得相关)。

因此,如果您知道 AB 是二进制补码,那并不能告诉您其中一个是否为负数。但是您不必关心,因为加法操作的工作原理相同,而无需考虑符号。在机器级别计算 A + B 会做正确的事情,而不需要区分大小写。

如果你想做A - B,那么你可能想计算A + (-B)。这意味着您必须对二进制补码数执行否定。要对这样的数字求反,您可以减去一个然后翻转所有位,或者您翻转所有位然后加 1:-B = ~(B - 1) = (~B) + 1(使用~ 表示按位不)。

请注意,硬件不必将减法作为否定然后加法。它可能有一个单独的减法指令,并且该单独的指令可以重用一些也用于加法的电路,但也可能有专门用于减法的电路。

【讨论】:

    【解决方案2】:

    添加二进制数的直接方法是使用一系列全加器。每个加法器将两位相加,输入一个进位位,并与求和位一起输出一个进位位。这是一种旧的、完善的数字设计,用于将二进制数解释为正整数。

    在现实生活中,用全加器将二进制数相加是一个愚蠢的想法。需要时间,工程师称之为“传播时间”,从最低有效位 (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 设计适用于这个疯狂的颠倒世界。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-13
      • 2014-06-17
      • 1970-01-01
      • 2013-11-20
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多