5

コンソールに255ASCII文字を書き込もうとしましたが、無限ループが発生しました

for(char i=0; i<256; i++) {
    cout << i << ' ';
}
4

4 に答える 4

13

i。以上になることはありません256。その前にオーバーフローします。その型は、符号なしの場合はchar最大値になり、符号なし255場合は最大値になる可能性があることに注意てください。127

署名されていないか署名されているかcharは、実装によって定義されます。しかし、通常、私の経験では、署名されています。つまり、通常、達成できる最大値はです。char127

したがってi、からに増分0127、次に-128からに増加し​​、までに増加します。署名127されている場合は、このようになります。署名されていない場合は、からになり、次に(オーバーフローのために)になり、ストーリーが再び始まります!02550

于 2012-11-24T16:00:48.493 に答える
5

のすべての値がchar256より小さいためです。

比較のために、char iはに変換されint、通常は-128〜127(符号付き2の補数の8ビット)、または符号なし8ビットタイプのchar場合は0〜255(両端を含む)の値になります。char

aが保持できる最大値に達すると、それ以上の増分は、符号なしのchar場合は0へのラップアラウンドにつながり、増分が格納されたときに生成された値128の実装定義の変換につながります。署名されている場合、結果は-128です。charintcharchar

于 2012-11-24T16:01:14.177 に答える
3

-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]である可能性が高くなります。

于 2012-11-24T16:14:10.237 に答える
2

これを試して!

for(int i=0; i<256; i++)
 {
    cout << char(i) << " ";
 }
于 2012-11-24T18:13:26.037 に答える