0

我碰到这在计算机体系结构教材传来:减2负整数(补)从来没有溢出

从另一个严格负整数减去一个严格的负整数(补)将永远不会溢出。

教科书没有继续解释这个断言。它激起我的好奇心。

为什么这种说法是正确的?

+2

出于同样的原因,添加负整数和正整数不会溢出。 –

+0

这并不能清除它。谨慎解释? –

+3

想一想 - 当您向正整数添加负整数时,结果必须位于两个起始值之间的某个位置。因此它可以用与起始值相同的位数表示。对于两个负数减去它是同样的事情 - 只要考虑你将一个数字的“减号”加到另一个数字上,使它成为正数和负数的加法。 –

回答

2

这是32位整数的工作原理。它适用于任何其他位长度。

最大的负数是-1。

最小的负数是-2^31。

如果结果大于或等于2^31或小于-2^31,则发生溢出。

通过从最大的一个减去最小的数字,您可以得到最大的减法结果。 -1 - ( - 2^31)= 2^31 - 1这足够小。

通过从最小的数中减去最大的数,可以得到最小的减法结果。 -2^31 - ( - 1)= - (2^31 - 1)。这大于-2^31。

0

这样的减法可以得到的数字范围是[MIN_INT + 1,MAX_INT],因此永远不会溢出。
为什么?
让有MIN_INT <= x,y < 0这样:MIN_INT = MIN_INT-0 < x-y < 0-MIN_INT = MAX_INT+1
并由此MIN_INT < x-y < MAX_INT + 1注意,“强” <防止溢出。

+0

您的范围不正确,最大的积极差异是MAX_INT,而不是MAX_INT-1。 –

+0

@PaulR:感谢您的评论,我编辑我的答案是更准确。 – amit

0

由于负符号的整数的范围是-1-(MAX_INT+1),两个这样的数字之间可能存在的差异范围是-MAX_INTMAX_INT。由于这个范围很容易表示(请记住整个带符号的整数范围是-(MAX_INT+1)MAX_INT),那么显然永远不会有溢出。