255 (10 進数) より大きい値を保持して ASCII 文字を出力すると、プログラムはいくつかの文字を出力します。なんで?254 は ASCII で最大の数ではありませんか? 負の数 (例: -6) を保持すると同じことが起こりますが、-1 と 0 では機能しません。なぜですか?
3 に答える
何が起こるかは、マシンによって異なります。
表現可能な最大値を超える値は、通常ラップ アラウンドします。したがって、たとえば、256 を保持している場合は 0 にラップアラウンドし、257 は 1 を返します。または、マシンが 256 の代わりに符号付き文字を使用している場合、最大値は 127 になり、128 は最も負の値 (つまり、2 の補数表現を想定して、8 ビット文字で -128)。これらの値がたまたま有効な印刷可能な文字を表している場合、それが得られます。
一般に、オーバーフローした値がラップアラウンドすると仮定するのは安全ではないことに注意してください。C 標準では、これが発生することを要求していないため、技術的には、そのトリックに依存するプログラムは未定義の動作をします。
これは未定義の動作であり、正確な結果は、プログラミング言語/コンパイラ/コンピューターなどの組み合わせによって異なります。例外やクラッシュが発生することもあれば、文字が表示されることもあります。キャラクターの場合、最もよく見られるのはオーバーフローです。標準の char 型は 1 バイトで、0 または 1 の 8 ビットで構成されています。詳細はシステムによって異なりますが、次のようになります。
256 を割り当てようとすると、バイナリ表現は次のようになります。
1 0000 0000 (a one with 8 zeros)
8 ビットしか保持できない char に変換します。したがって、最初のビットが切り捨てられ、次のようになります。
0000 0000 (8 zeros)
これは値 0 に相当します。したがって、システムがたまたま私が説明したように動作する場合、値 0 に関連付けられている ASCII 文字を出力することになります。エンディアンなどのシステムの詳細。