2 个负整数(二进制补码)相减不会溢出

发布于 2024-12-06 07:15:44 字数 154 浏览 1 评论 0原文

我在一本计算机体系结构教科书中看到了这一点:

从另一个严格负整数(二进制补码)中减去一个严格负整数永远不会溢出。

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

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

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

妥活 2024-12-13 07:15:44

以下是 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.

前事休说 2024-12-13 07:15:44

由于负符号整数的范围是 -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 to MAX_INT. Since this range is easily representable (remember that the full signed integer range is -(MAX_INT+1) to MAX_INT), then evidently there can never be an overflow.

甲如呢乙后呢 2024-12-13 07:15:44

通过这样的减法可以获得的数字范围是[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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文