google-code-prettify

2008-09-04

signedの比較 - 答え

前回の答え。

long a = 0x80000000;
long b = 1;

if (a - b > 0) {
printf("hello");
} else {
printf("world");
}

これは、helloではなくworldが出力される事もある。

なぜかと言うと…

Cでは、signedの計算でオーバーフローした時の動作は、未定義。
そのためコンパイラは、「signedの計算はオーバーフローしない」と思って最適化をかける事がある。

コンパイラの最適化の結果、a-b>0が、a>bに変換されると、以下のコードになる。

long a = 0x80000000;
long b = 1;

if (a > b) {
printf("hello");
} else {
printf("world");
}

この場合、aは負、bは正なので、worldが出力される事になる。

0 件のコメント: