11
2つの整数(int x, y;
)があるとします。
x
は負であり、y = 0x80000000
です。オーバーフローのない減算?
x + (-y)
の間に(x - y)
がオーバーフローしないのはなぜですか?
コンピュータは加算による減算をしませんか?
2つの整数(int x, y;
)があるとします。
x
は負であり、y = 0x80000000
です。オーバーフローのない減算?
x + (-y)
の間に(x - y)
がオーバーフローしないのはなぜですか?
コンピュータは加算による減算をしませんか?
最初の質問に答えるために、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)
を実行します。しかし、これは純粋な推測です(私が安全に行うことができる唯一の方法です)。
あなたはそれがどういうことを知っていますか? – lindelof
"コンピュータシステム、プログラマの視点"問題2.32(page 87) の解決策 "... -yもTMinに等しいので、関数tadd_okは、xが負のときに負のオーバーフローとみなします。実際、xyはこれらのケースでオーバーフローしません... " – Yuu