12

假设有两个整数(int x, y;)。
x是负数并且y = 0x80000000

为什么不(x - y)溢出而x + (-y)呢?
计算机不做加法减法吗?

4

1 回答 1

8

要回答您的第一个问题,0x80000000 (-2,147,483,648) 表示有符号整数的最小 32 位值。2,147,483,647 是最大值。当使用二进制补码存储时,最大值的大小比最小值的大小小一。不能(-y)单独表示,因为它超过了最大值(1)。的最终整数值(x-y)在范围内(假定x为负数)并且可以用 32 位整数表示。

要回答您的第二个问题,减法是通过将要减去的数字转换为其加法倒数来实现的。鉴于在这种情况下可能发生溢出,您的编译器可以(x-y)通过执行-((-x)+y). 然而,这纯粹是猜测(这是我能想到的唯一安全的方法)。

于 2012-06-08T09:39:53.043 回答