2012-06-08 5 views
11

2つの整数(int x, y;)があるとします。
xは負であり、y = 0x80000000です。オーバーフローのない減算?

x + (-y)の間に(x - y)がオーバーフローしないのはなぜですか?
コンピュータは加算による減算をしませんか?

+0

あなたはそれがどういうことを知っていますか? – lindelof

+0

"コンピュータシステム、プログラマの視点"問題2.32(page 87) の解決策 "... -yもTMinに等しいので、関数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ビット整数で表すことができます。

2番目の質問に答えるには、減算する数値を減算してその逆数の逆数に変換します。このような状況でオーバーフローが発生する可能性がある場合、コンパイラは(x-y)に対して正しい結果を得るには-((-x)+y)を実行します。しかし、これは純粋な推測です(私が安全に行うことができる唯一の方法です)。