无符号整数溢出的规则是进位与进位一致吗?

问题描述 投票:0回答:1

我正在阅读一本有关系统编程的教科书,它指出当且仅当最左边的位中的进位与进位不匹配时,无符号整数才会发生溢出。

因此,如果使用四位,我们将 1111 与 0001 相加,似乎是这样说的,因为最右边的位和有一个进位,并且它最终一直向左进位,即最左边的进位位是 1。但是它的进位也是 1,所以它们匹配,所以这不是溢出。

但这对我来说似乎完全错误。 在无符号整数中,这是 15+1,结果为 0,这应该是溢出,是吗? 因此我想确认我的想法是否正确。

进位和出位不匹配导致溢出的规则是 2 的补数的规则,不是无符号整数的规则,对吧?

对于无符号整数,我认为规则应该是:当且仅当最左边位的进位为 1 时才会发生溢出。

binary integer-overflow twos-complement unsigned-integer
1个回答
0
投票

问题所指的段落似乎是 Suzanne J. Matthews、Tia Newhall 和 Kevin C. Webb 撰写的《深入系统》第 4.5.2 节中的“无符号溢出”,可在此处获取。在此,作者描述了以通常的方式将两个操作数相加,并将0进位到低位。对于加法,此进位不会改变算术。当且仅当高位的进位输出为 1 时才会发生溢出,这与进位输出与进位输入不匹配时相同。 对于减法,作者使用的是这个算法:

对减数进行按位补码。
  1. 将被减数和低位进位为 1 的减数相加。
  2. 这相当于将减数的补码与被减数相加。由于在二进制补码中,数字的二进制补码是其负数,因此我们可以看到这会产生减法。

如果进位为0,则加法步骤(视为加法)没有溢出,并且结果大于被减数。这是减法错误;非溢出减法将产生小于或等于被减数的结果。如果进位为 1,则加法确实溢出,并且生成的结果小于或等于被减数,这是减法的非溢出情况。因此,当且仅当进位输出与进位输入 1 不匹配时,我们才会看到减法溢出。

减数为零的情况值得考虑。如果我们取被减数的补码零,我们将产生零,然后将被减数和零相加将产生进位 0。但是,该算法将被减数和减数的补码相加,并得到一个进位为 1。在此加法中,进位为 1,这是我们想要的结果,因为它表明减法没有溢出。

© www.soinside.com 2019 - 2024. All rights reserved.