2012-06-08 35 views
11

假设有两个整数(int x, y;)。
x是负数,y = 0x80000000没有溢出的减法?

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

+0

你怎么知道它呢? – lindelof

+0

“计算机系统,程序员的角度”问题的解决方案2.32(第87页) ” ......我们将有-y也等于三甲基铟等功能tadd_ok会考虑那里是负溢出随时x为负。在事实上,xy不会因这些情况而溢出......“ – Yuu

回答

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)。然而,这是纯粹的猜测(这是我能想到的唯一安全方法)。