【问题标题】:What does an overflow means exactly?溢出到底是什么意思?
【发布时间】:2018-01-02 05:05:52
【问题描述】:

关于溢出的含义,我已经阅读了两个定义。

假设我们有以下添加:

 11111111
 00000001
 --------
100000000

我读到的第一个定义是结果不适合 8 位(在本例中需要 9 位),这称为溢出。


我读过的另一个定义是,如果我们有两个有符号整数的加法(例如二进制补码整数):

 10011001
 10111011
 --------
101010100

那么如果 8 位结果 (01010100) 的符号与两个整数的符号不同(在本例中也不同),则这称为溢出。

哪个定义是正确的?

【问题讨论】:

  • 第一个定义是base。二是后遗症
  • 它们实际上是一回事
  • 一个是有符号的,另一个是无符号的溢出,你应该这样想它们。在这两种溢出情况下,这仅意味着您没有足够的位来正确表示结果。基本上你还需要一点。

标签: math assembly integer overflow twos-complement


【解决方案1】:

这两种情况都可以通过在结果中再添加一位来解决。 正如Wikipedia page for Integer Overflow 所述,当运算结果与目标寄存器/变量不匹配时,会发生整数溢出。例如。 0x10000 * 0x10000 也是 32 位整数的溢出。

典型的处理器架构将无符号整数溢出与有符号整数溢出的情况分开到状态寄存器中的两个不同标志;无符号进位/借位,有符号加法溢出。

【讨论】:

    【解决方案2】:

    他们都是正确的。当数字的计算由于结果不再符合数字的存储格式而导致错误时,就会发生溢出。

    所以在第一种情况下,发生溢出是因为您需要 9 位,而只有 8 位可用(这意味着现在存储在字节中的数字不能准确反映答案)。

    在第二种情况下,发生溢出是因为结果干扰了有符号位,也导致字节包含不正确的值。

    【讨论】:

    • “导致错误”会误导一些读者,因为 CF OF 和 AF 标志中的转换仅表示先前操作的结果。 X86 中的错误,假设这就是我们正在讨论的架构,将引发异常。
    • 我的意思是数学错误而不是运行时错误。在 Z80 中,这两种情况都会触发 CPU 中的标志,可以测试是否发生溢出。
    猜你喜欢
    • 2017-08-07
    • 2017-07-20
    • 2014-09-23
    • 2014-07-25
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多