2012-06-08 83 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)。然而,這是純粹的猜測(這是我能想到的唯一安全方法)。