假设有两个整数(int x, y;
)。
x
是负数并且y = 0x80000000
。
为什么不(x - y)
溢出而x + (-y)
呢?
计算机不做加法减法吗?
要回答您的第一个问题,0x80000000 (-2,147,483,648) 表示有符号整数的最小 32 位值。2,147,483,647 是最大值。当使用二进制补码存储时,最大值的大小比最小值的大小小一。不能(-y)
单独表示,因为它超过了最大值(1)。的最终整数值(x-y)
在范围内(假定x
为负数)并且可以用 32 位整数表示。
要回答您的第二个问题,减法是通过将要减去的数字转换为其加法倒数来实现的。鉴于在这种情况下可能发生溢出,您的编译器可以(x-y)
通过执行-((-x)+y)
. 然而,这纯粹是猜测(这是我能想到的唯一安全的方法)。