2 个负整数(二进制补码)相减不会溢出
我在一本计算机体系结构教科书中看到了这一点:
从另一个严格负整数(二进制补码)中减去一个严格负整数永远不会溢出。
教科书没有继续解释这个断言。这激起了我的好奇心。
为什么这个说法是正确的?
I came across this in a computer architecture textbook:
Subtracting a strictly negative integer from another strictly negative integer (in two's complement) will never overflow.
The textbook doesn't go on to explain this assertion. It piqued my curiosity.
Why is this statement true?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
以下是 32 位整数的工作原理。对于任何其他位长度,它的工作原理都是相同的。
最大的负数是-1。
最小的负数是-2^31。
如果结果大于或等于 2^31,或小于 -2^31,则会发生溢出。
通过用最大的数减去最小的数,可以得到最大的减法结果。 -1 - (-2^31) = 2^31 - 1。这已经足够小了。
通过用最小的数减去最大的数,可以得到最小的减法结果。 -2^31 - (-1) = -(2^31 - 1)。这大于-2^31。
Here's how it works for 32 bit integers. It works the same for any other bit length.
The largest negative number is -1.
The smallest negative number is -2^31.
Overflow occurs if a result is greater than or equal to 2^31, or smaller than -2^31.
You get the largest result of a subtraction by subtracting the smallest number from the largest one. -1 - (-2^31) = 2^31 - 1. This is small enough.
You get the smallest result of a subtraction by subtracting the largest number from the smallest one. -2^31 - (-1) = -(2^31 - 1). This is greater than -2^31.
由于负符号整数的范围是
-1
到-(MAX_INT+1)
,因此两个此类数字之间可能的差异范围是-MAX_INT
> 到MAX_INT
。由于这个范围很容易表示(请记住,完整的有符号整数范围是-(MAX_INT+1)
到MAX_INT
),因此显然永远不会发生溢出。Since the range of negative signed integers is
-1
to-(MAX_INT+1)
, the range of possible differences between two such numbers is-MAX_INT
toMAX_INT
. Since this range is easily representable (remember that the full signed integer range is-(MAX_INT+1)
toMAX_INT
), then evidently there can never be an overflow.通过这样的减法可以获得的数字范围是[MIN_INT+1,MAX_INT],因此永远不会溢出。
为什么?
设
MIN_INT <= x,y < 0
所以:MIN_INT = MIN_INT-0
xy < 0-MIN_INT = MAX_INT+1
因此
MIN_INT < xy < MAX_INT + 1
请注意,“强”<
可防止溢出。the range of numbers that can be obtained by such a substraction is [MIN_INT+1,MAX_INT], and thus will never overflow.
why?
let there be
MIN_INT <= x,y < 0
so:MIN_INT = MIN_INT-0 < x-y < 0-MIN_INT = MAX_INT+1
And thus
MIN_INT < x-y < MAX_INT + 1
note that 'strong'<
prevent overflow.