《计算机组成与体系结构(原书第4版)》 —2.4.6 进位和溢出
2.4.6 进位和溢出
前面所提到的“返回零”的情况都是真正的溢出。CPU通常具有指示进位和溢出的标志。但是,溢出标志仅用于有符号数,在无符号数中没有意义,在无符号数中使用进位标志。如果进位(表示最左边的位有进位)出现在无符号数中,我们知道有溢出(新值太大而无法存储在给定的位数中)了,但溢出位并没有置位。进位同样会发生在有符号数中,然而,在有符号数中出现的这种情况,对于溢出而言既不充分也不必要。我们已经看到,如果在有符号数中进入最左边位的进位和最左边位出来的进位不同,则可以确定有溢出。然而,在无符号运算中,从最左边位出来的进位总是指示溢出。
为了说明这些概念,考虑4位无符号数和有符号数。如果将两个无符号数0111(7)和0001(1)相加,得到1000(8)。由于没有进位,因此没有错误。然而,如果将两个无符号数0111(7)和1011(11)相加,会得到0010并产生进位。这表示出现了错误(实际上,7+11不等于2)。这将会导致CPU设置进位标志。实际上,即使溢出标志未设置,无符号数中的进位意味着发生溢出。
我们说在无符号数中符号位进位对于溢出既不充分也不必要。考虑用2的补码表示的整数0101(+5)和0011(+3)相加。结果是1000(-8),这明显不正确。问题是有一个进位进入符号位,但没有进位出符号位,这表明有一个溢出(因此,进位对溢出不是必需的)。但是,如果现在对0111(+7)和1011(-5)做加法运算,我们得到正确的结果:0010(+2)。最左边的位既有进位进入也有进位出来,所以没有错误(进位对溢出不是必需的)。进位标志将置位,但溢出标志将不会置位。因此,在有符号数中,有符号位进位并不一定表示有错误,同样没有符号位进位并不一定表示答案是正确的。
总而言之,用于确定进位何时表示错误的经验法则取决于是使用的是有符号数还是无符号数。对于无符号数,一个进位(最左边位出来的)表示位的总数不够大不足以保存结果值,并发生溢出。对于有符号数,如果进入符号位的进位和从符号位出来的进位不同,则发生溢出。溢出标志仅在有符号数溢出时置位。
进位和溢出显然彼此独立地发生。在表2-2中给出使用以有符号数2的补码表示的例子。表中没有表示进位到符号位的情况。
表2-2 在有符号数中进位和溢出的例子
- 点赞
- 收藏
- 关注作者
评论(0)