0
{
int i=1;
while(i<=32767)
{
printf("%d",i);
i=i+1;
}
}

1 から 32767 を出力する単純なプログラムのように見えます ...しかし、32767 に達すると ...値を 1 ずつインクリメントすると...整数の範囲外にある 32768 に移動しようとし、反対側に移動しますis -32768 .....これにより、i<=32767 ie -32768 として条件が true になるため、不定ループとして機能するはずです。私の Dev C++ コンパイラは、1 から 32767 までしか出力しません....不定ループとして機能しません。誰でも

4

2 に答える 2

10

おそらく、プラットフォーム上の整数のサイズは > 16 ビットです。

ISO/IEC 9899:201x の状態

int 型のオブジェクトの最小値

INT_MIN -32767 // -(2 15 - 1)

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

実際、最近のほとんどの C コンパイラは、ほとんどのプラットフォームで 16 ビットより大きい整数を使用します。

C では、整数は少なくとも16 ビットであることが保証されています。特定のサイズであると仮定することは危険であり、携帯できません。常にチェックしてください。

于 2012-10-08T18:02:03.997 に答える
3

まず、intプラットフォームの の範囲が でオーバーフローしていると確信しています32767か? 最新のプラットフォームのほとんどは 4-byteintを使用しています。つまり、その範囲は-32768..+32767.

次に、符号付き整数のオーバーフローにより、C および C++ で未定義の動作が発生します。32767オン-32768インクリメントになり、ループが無限になるというあなたの期待は完全に根拠がありません。言語はそのようなことを保証しません。オーバーフローが発生した瞬間に、プログラムが単純にクラッシュする可能性があります (一部のコンパイラは、そのようなオーバーフローでプログラムが中断されることを保証するコードを意図的に生成できます)。

第三に、最新のコンパイラの中には、いわゆる厳密なオーバーフロー セマンティクスを実装しているものがあります (GCC はその一例です)。符号付き整数のオーバーフローは未定義の動作を生成するため、コンパイラは適切と思われる方法で自由にコードを変換できます。コンパイラは、これを無条件の無限ループに変換できます。または、多かれ少なかれ明確に定義された終了ループに変換できます。

于 2012-10-08T18:03:24.577 に答える