【问题标题】:two's complement - what if there's one more bit needed to represent a binary in 2's complement form二进制补码 - 如果需要多一位来表示 2 的补码形式的二进制怎么办
【发布时间】:2018-02-19 10:57:03
【问题描述】:

我在一所高中学习计算机科学 A-level 课程,目前正在研究补码算术。出于某种原因,我不太明白。我知道如何将有符号整数转换为其等效的二进制补码,但这是我的困惑:

  1. 我做了一些研究,人们说作为进位位的操作码告诉 CPU 2 的补码是代表正整数还是负整数,但根据某些人的说法,有时进位位会被忽略;比如1111(-1)加1000(-8)就是10111(-9),但是如果是4位的电脑,第5位的最高位是无法存储的,那么电脑怎么做处理那个?
  2. 一个有点微不足道的问题是,如果给定 00110011 表示二进制补码形式的有符号整数,我怎么知道实际代码是 0110011,它是一个正数(以 2 的补码形式),还是 110011,它是一个负数(2 的补码形式)?

谢谢!

【问题讨论】:

    标签: binary


    【解决方案1】:

    通常情况下,不合适的会丢失。所以,11112 + 10002 = 01112。但是,某些 CPU 具有特殊标志,根据是否存在无符号溢出(进位标志)和有符号溢出(溢出标志),将其设置为 0 或 1。当算术指令在没有溢出的情况下无法产生结果时,某些 CPU 可能会自动引发溢出异常。

    通常,CPU 不关心 11112 是 -110 还是 1510。无论您是对无符号整数还是 2 的补码有符号整数进行运算,两个 N 位整数的二进制加法和减法都会为您提供相同的 N 位和或差。将两个 N 位有符号 2 的补码或无符号整数相乘时也是如此:乘积的 N 个最低有效位在两种情况下都是相同的。

    IOW,您的工作是跟踪您正在操作的类型、处理溢出(如果可能的话)并为这些类型选择适当的指令(例如,您通常有有符号和无符号除法、有符号和无符号比较等)。

    【讨论】:

    • 感谢您的回复!基本上,我理解 CPU 并不关心二进制代码是 + 还是 - 在操作时,但是,我在这里有一个具体的例子,也许可以更好地解释什么对我来说很棘手:
    • 当将 0101 (+5) 添加到 1111(在这种情况下可以是 -1 或 15)时,我们得到 10100 作为结果。如果我们忽略前导的 1,它会变成 0100,即 5 和 -1 的和;但是当我们保持领先的 1 时,它变成了 10100,即 5 和 15 的总和......所以我很困惑计算机如何选择忽略溢出的位以得出正确的答案?
    • @Francis.Tricka CPU 没有选择这里。它只是简单地进行 N 位 + N 位 = N 位加法。其中 N 通常为 8、16、32 或 64,即 CPU 中通用寄存器的大小。加法是从最低有效数字到最高有效数字,对吗?因此,您可以在计算 N 位的总和后停止该过程。
    • 哦,我明白了它是如何工作的,但是为什么溢出位在丢失时不会影响正确的计算,因为丢失的位代表一个数字?
    • @Francis.Tricka 溢出标志如何影响结果?为什么要这样做? (除了修改标志之外,设置标志和做其他事情还有额外的复杂性)如果你关心溢出,你检查标志。通常你不关心或确定没有溢出,所以你不检查标志。
    猜你喜欢
    • 2021-12-21
    • 2010-10-13
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    相关资源
    最近更新 更多