【问题标题】:Adding Two's Complement binary添加二进制补码
【发布时间】:2015-04-07 06:53:37
【问题描述】:

女士们,先生们,我已经成功地理解了无符号二进制数的加法等。但是,这个二的补码让我打败了。让我用一些例子来解释一下。

示例练习题,使用8位有符号整数存储系统执行每个算术,在二进制补码下:

  1111111
  01100001
+ 00111111
----------
  10100000    <== My Answer (idk if right / wrong), but i think right.

所以它不超过 8 位,但是我们改变了(正 + 正)= 负。那一定是溢出,因为标志在变化,对吧? (我一直不明白 MSB 中的进位和执行 MSB 是什么)。

对我来说真正棘手的部分是以下等式:(负 + 负)实际上等于(负 - 正)。

       111111
      10111111
    + 10010101
    ----------
  1 | 01010100

所以我认为这应该是错误的,因为当我们丢弃溢出位(左侧字段中的 1)时,它会将 8 位表示变为正数,而它应该是负数。所以这会导致溢出,不是吗?

以下等式类似:

      1111
     10001110
   + 10110101
   ----------
 1 | 01000011

可以理解,如果我们使用 16 位等,那么这些不会溢出,因为符号没有改变,所以数学是正确的。但是因为当我们存储这些数字的 8 位表示时,我们会丢失 MSB,这会翻转符号。

但我注意到我的理论的一件事是,每当添加两个负数时,MSB 显然总是为 1,因此你总是会有一个进位,这意味着你总是会有一个溢出。

** 我认为更合乎逻辑的结论是,我忘记在添加第二个否定词之前将它们转换为肯定词或其他东西,或者类似的东西。但我已经尝试过 youtube 和各种在线研究。 TBH,我的教授在整个“沟通”方面都很糟糕。我会很感激社区可以提供的任何帮助,所以我可以克服这些问题并解决更难的材料 XD。

【问题讨论】:

    标签: math binary twos-complement


    【解决方案1】:

    是的,你的数学是正确的。

    两个恭维的优雅之处在于,加法“正常工作”,无需对符号位进行任何特殊考虑。这两个减法都下溢的原因是因为数字的数量级已经很大了。

    让我们用十进制来做最后两个问题:

       (-65)
    + (-107)
    --------
      (-172) which underflows to 84.
    
      (-114)
    +  (-75)
    --------
      (-189) which underflows to 67.
    

    最小的有符号 8 位值是 -128,所以它们都下溢。

    【讨论】:

    • 所以,要清楚.. 我对两个减法的数学运算是正确的。它们溢出的原因是因为它们超过了 8 位表示的最大边界(-128)?如果它是 16 位的,它们会完全有效吗?
    • 是的,你的数学是正确的。 (对不起,我忘了提这个!修复) 编辑:在 16 位 int 中,溢出位不会丢失,从而产生正确的答案。
    【解决方案2】:

    是的,如果您丢弃一个 1 进位位,则表示溢出。不用担心溢出。丢弃进位是正确的。

    但是因为当我们存储这些数字的 8 位表示时,我们会丢失 MSB,这会翻转符号。

    重要的是不要将丢弃 1 位视为翻转符号。首先,丢弃进位位与翻转符号位不同。您可以从否定结果中丢弃进位位,但最终仍会得到否定答案。例如:

        1111111  
        11111111   (-1)
      + 11111111   (-1)
        --------
    1 | 11111110   (-2)
    

    最后的 1 个进位位被丢弃,但答案的符号不翻转。

    其次,即使您正在考虑翻转(而不是丢弃)符号位,也不能将其视为翻转符号。在符号幅度表示中,翻转符号位将翻转数字的符号。但是在一个和两个的补码中,否定不仅仅是翻转最左边的位。如果你只是翻转位,你会得到一个非常不同的数字。是的,它有相反的符号,但它不是同一个数字。

               Sign Mag.  |  One's Compl.  |  Two's Compl.
    01111111 =    127     |      127       |       127
    11111111 =   -127     |      -0        |       -1
    

    【讨论】:

    • 好的,非常非常好的例子表明并不总是丢弃进位位会改变 MSB。我现在明白它可能会走任何一条路。但是在我的示例中,是否会丢弃与 8 位存储相关的进位信号溢出?我知道数学是正确的,如果存储空间更大,我们会很好,但由于我们的存储空间有限,数据会变得不正确,不是吗?因为在我的示例中,MSB 之后的下一个数字是零,因此至少翻转符号(并且可能还会更改数字)。
    • 有时这取决于您如何解释这些数字。如果您将数字解释为有符号 (-1 + -1 = -2),则 11111111 + 11111111 的溢出是无害的。如果您将它们解释为无符号,则溢出是错误的 (255 + 255 = 254)。
    猜你喜欢
    • 2015-04-12
    • 1970-01-01
    • 2018-09-02
    • 2012-11-23
    • 1970-01-01
    • 2011-11-05
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多