2つのinteger(int x, y;
)があるとします。
x
は負であり、y = 0x80000000
。
なぜ(x - y)
オーバーフローしx + (-y)
ないのですか?
コンピューターは足し算で引き算をしませんか?
最初の質問に答えるために、0x80000000(-2,147,483,648)は、符号付き整数の最小32ビット値を表します。2,147,483,647が最大値です。最大値の大きさは、 2の補数を使用して保存された場合の最小値の大きさより1つ小さくなります。最大値(1)を超えているため、単独での取得(-y)
は表現できません。の最終的な整数値(x-y)
は範囲内にあり(x
負の場合)、32ビット整数で表すことができます。
2番目の質問に答えるために、減算は、減算する数値をその反数に変換することによって実現されます。この状況でオーバーフローが発生する可能性がある場合、コンパイラはを実行することで正しい結果を得ることができ(x-y)
ます-((-x)+y)
。しかし、これは純粋な推測です(これは私が安全にそれを行うために考えることができる唯一の方法です)。