コンソールに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は、実装によって定義されます。しかし、通常、私の経験では、署名されています。つまり、通常、達成できる最大値はです。char127
したがってi、からに増分0し127、次に-128からに増加し、までに増加します。署名127されている場合は、このようになります。署名されていない場合は、からになり、次に(オーバーフローのために)になり、ストーリーが再び始まります!02550
のすべての値がchar256より小さいためです。
比較のために、char iはに変換されint、通常は-128〜127(符号付き2の補数の8ビット)、または符号なし8ビットタイプのchar場合は0〜255(両端を含む)の値になります。char
aが保持できる最大値に達すると、それ以上の増分は、符号なしのchar場合は0へのラップアラウンドにつながり、増分が格納されたときに生成された値128の実装定義の変換につながります。署名されている場合、結果は-128です。charintcharchar
-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](+)の範囲にあるため、厳密に劣るため、条件は常に真になります。iint256i256
(+)char署名されているかどうかに関係なく実装で定義され、署名されていない場合char、その範囲は[0、255]である可能性が高くなります。
これを試して!
for(int i=0; i<256; i++)
{
cout << char(i) << " ";
}