コンソールに255ASCII文字を書き込もうとしましたが、無限ループが発生しました
for(char i=0; i<256; i++) {
cout << i << ' ';
}
コンソールに255ASCII文字を書き込もうとしましたが、無限ループが発生しました
for(char i=0; i<256; i++) {
cout << i << ' ';
}
i
。以上になることはありません256
。その前にオーバーフローします。その型は、符号なしの場合はchar
最大値になり、符号なしの255
場合は最大値になる可能性があることに注意してください。127
署名されていないか署名されているかchar
は、実装によって定義されます。しかし、通常、私の経験では、署名されています。つまり、通常、達成できる最大値はです。char
127
したがってi
、からに増分0
し127
、次に-128
からに増加し、までに増加します。署名127
されている場合は、このようになります。署名されていない場合は、からになり、次に(オーバーフローのために)になり、ストーリーが再び始まります!0
255
0
のすべての値がchar
256より小さいためです。
比較のために、char
i
はに変換されint
、通常は-128〜127(符号付き2の補数の8ビット)、または符号なし8ビットタイプのchar
場合は0〜255(両端を含む)の値になります。char
aが保持できる最大値に達すると、それ以上の増分は、符号なしのchar
場合は0へのラップアラウンドにつながり、増分が格納されたときに生成された値128の実装定義の変換につながります。署名されている場合、結果は-128です。char
int
char
char
-Wtautological-compare
(この問題については)警告をオンにしてコンパイルする必要があります。
C ++では、各整数型にはさまざまな可能な値があります。この範囲は(通常)実装で定義されていますが、一般的なプラットフォーム(x86)では次のことが頻繁に発生します。
signed char
[-128、+ 127](+)short
[-2 * 15、2 * 15-1]int
[-2 * 31、2 * 31-1]符号付き積分型を最大値を超えてインクリメントしようとすると、未定義動作の領域に入ります。一般的な実装では、(符号なしタイプの場合と同様に)ラップアラウンドするため、127 + 1は-128(の場合char
)になります。
と比較するときは、最初にからの値を(整数の接尾辞のないタイプ)に256
キャストしてから、比較を実行します。ただし、は常に[-128、127](+)の範囲にあるため、厳密に劣るため、条件は常に真になります。i
int
256
i
256
(+)char
署名されているかどうかに関係なく実装で定義され、署名されていない場合char
、その範囲は[0、255]である可能性が高くなります。
これを試して!
for(int i=0; i<256; i++)
{
cout << char(i) << " ";
}