没有溢出的减法?

时间:2012-06-08 09:32:43

标签: c integer overflow precision

假设有两个整数(int x, y;x为负数且y = 0x80000000

(x - y)为什么x + (-y)不会溢出? 计算机不能通过添加进行减法吗?

1 个答案:

答案 0 :(得分:8)

要回答第一个问题,0x80000000(-2,147,483,648)表示有符号整数的最小32位值。 2,147,483,647是最大值。使用Two's Complement存储时,最大值的大小比最小值的大小小1。单独使用(-y)无法表示,因为它超过了最大值(按1)。 (x-y)的最终整数值在范围内(假设x为负)并且可以用32位整数表示。

要回答第二个问题,通过将要减去的数转换为其加法逆来实现减法。鉴于在这种情况下可能出现溢出,您的编译器可以通过(x-y)获得-((-x)+y)的正确结果。然而,这是纯粹的推测(这是我能想到的唯一安全方法)。

相关问题