【问题标题】:How to handle Two's complement Overflow in Binary representation如何处理二进制表示中的二进制补码溢出
【发布时间】:2017-07-17 15:35:22
【问题描述】:

在此链接中,我正在查看 CMU 的计算机科学复习材料。

x = 30
y = -29

我们如何处理二进制加法的溢出? 我以为我明白了,但这是我将两个加到 30 时得到的结果。

Two's Complement 30 representation:

0001 1100 x = 30

x+2 = 32

  0001 1110 
+ 0000 0010
------------
  0010 0000

这不等于 32,正数吗? 答案键是 x + 2 = -32,虽然它表明存在溢出,但我不确定我可以在哪里进行逻辑跳跃/假设它会是负数。

请向我解释这个推理来自哪里/我哪里出错了。谢谢!

编辑:图片似乎从链接中消失了。

【问题讨论】:

  • 你了解 2-complement 的工作原理吗?你读过en.wikipedia.org/wiki/Two's_complement,例如(那里还有“为什么有效”部分)?
  • 我真的不明白我们怎么能说十六进制表示是 0x20,如果它是一个正数。这似乎表明它至少是 0x80 数字,因为前导位必须是 1 才能使二进制补码为负。
  • @SergGr 我了解二的补码,这就是为什么我对如何从 30 点到 32 点的负数有点困惑,难道我们不应该最大翻转/最重要的位?所以如果我们加两个,我们仍然在一个正范围内。 x + 2 不会导致溢出。
  • 显然从y 的表示方式来看,在此任务中,数字存储在 6 位容器中,而不是当今更典型的 8 位字节。
  • @SergGr 六位容器如何影响计算?它是改变我们位的倍数还是仅仅在我们溢出时改变?

标签: assembly binary boolean-logic twos-complement


【解决方案1】:

您对二人恭维的理解似乎是正确的。假设 8 位,30 + 2 应该是你所说的 32。但是,如果我们假设 6 位,我们会得到该表提供的答案。

  01 1110
+ 00 0010
---------
= 10 0000

由于前导位与两个操作数不同(我们正在执行两个正数的加法),因此发生了溢出,答案为 -32。

【讨论】:

    猜你喜欢
    • 2021-10-27
    • 1970-01-01
    • 2021-12-21
    • 2023-03-25
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    相关资源
    最近更新 更多