2
for (i = 0; i <= N; ++i) { ... }

N が の場合、この特定のステートメントは無限ループを引き起こしますINT_MAX。符号なしオーバーフローがオーバーフローをラップしていることを知っていれば、コンパイラは符号なしと仮定iして、オーバーフローで が定義されていない場合N、ループが正確に繰り返されると想定できます。ここで注意すべきことは、次のようにループを作成すると、N+1i

for (i = 0; i < N; ++i) { ... }

これはまだ未定義の動作になりますか?

符号付き整数の場合、 がINT_MAX + 1確実に等しくないのはなぜですか?INT_MIN

4

2 に答える 2

2
Why INT_MAX + 1 is not surely equal to INT_MIN in case of signed integers? 

まず、整数オーバーフローの動作は C 標準では定義されていません。ほとんどの実装では、数値が静かにオーバーフローするように見えるので、そのように仮定しましょう。

次に、C 標準は2 の補数の整数を想定していません。ほとんどのプラットフォーム、特に新しいプラットフォームで使用されています。1 の補数など、他の整数表現を使用する古いプラットフォームがありました。1 の補数でオーバーフローすると、負のゼロになります。

特定の方法で動作するために未定義の動作に依存することは、プログラムの移植性を大幅に低下させるため、本当に悪いプログラミング手法です。OS やコンパイラのアップグレードでさえ、未定義の動作を変更する可能性があるため、同じ OS の異なるバージョン間での移植性さえない可能性があります。

于 2013-10-15T08:54:33.357 に答える