Cでオーバーフローを検出する手法について読んでいました。さらにオーバーフローを検出するための誤った解決策を示す例の1つは、これです。
/* Determine whether arguments can be added without overflow */
int tadd_ok(int x, int y) {
int sum = x+y;
return (sum-x == y) && (sum-y == x);
}
そしてそれはそれが機能しないと言った:
2の補数の加算はアーベル群を形成するため、式(x + y)-xは、加算がオーバーフローするかどうかに関係なくyと評価され、その(x + y)-yは常にxと評価されます。
正確にはどういう意味ですか?Cコンパイラがに置き換えられるということsum
ですx+y
か?
それが何を言っているのかを理解するために、私はプログラムのアセンブリコードをトレースしましたが、置き換えの兆候はありませんでした。
更新:私の質問の本質は、GCCは式を計算せずに評価するのかということです。
これは2の補数についての質問ではありません。ここで
サンプル出力を見ることができます。