0

データ型の改訂版の章を開始したところです。私は現在、署名された文字と署名されていない文字の概念を研究しています。私の疑問は、署名された文字の範囲が-128から127であるということですが、なぜ以下のコードがまだ実行されているのでしょうか? また、以下のコードは私には理解できない無限の o/p を与えています。

main( )
{
char ch ;
for ( ch = 0 ; ch <= 255 ; ch++ )
printf ( "\n%d %c", ch, ch ) ; 
}

現在、GCC 32 ビット コンパイラを使用しています。上記のコードのo/pを説明するのを手伝ってくれる人はいますか?

4

3 に答える 3

4
for ( ch = 0 ; ch <= 255 ; ch++ )

が符号付き文字の場合ch、0 から始まり 127 まで増加します。次に、次の増加で「ラップアラウンド」して -128 になります。unsigned の使用char:

127 = 0x7F
128 = 0x80

ただし、signed charを使用すると、 0x80-128 になります。

したがってch、-128 から 127 まで実行されます。これらの値はすべて 255 未満であるため、プログラムを停止するまでこれが繰り返されます。

于 2013-06-23T04:38:49.313 に答える
1

符号付き文字は -128 から 127 までなので、その 2 進数は 10000000 と 01111111 です。「ch」が 127 になると、次のインクリメント「ch」は -128 になり、常に 255 未満になるため、o/p は無限になります。

于 2013-06-23T05:21:04.647 に答える
0

あなたはおそらく出力と混同しています。私はあなたがこのようなものを見ていると思います。

0

1

2

3 ...

11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32...

33 ! 34" .... 125 } 126 ~ 127

255 → 256 257

... 511 � 512 513 .. など

0 to 32 are all flags(unprintable codes)(したがって、出力は表示されませんが、最初の 33 の数字のみが表示されます) followed by characters till 127。ご覧のとおり、255 文字ごとに折り返して同じ結果が得られますbut it actually stops printing characters after multiples of 127(これは 127 文字のリストです - http://web.cs.mun.ca/~michael/c/ascii-table.html )。127 の後に -128 にリセットされるだけなので、文字をリセットしているにもかかわらず、プログラムは数字を無限大に出力し続けます。これはprintf("%d",ch) for -127 it prints 128、 などを ch = 255 まで繰り返した後、再び反転して 256 以降の出力を開始するが、実際の ch 値が 127 を超えることはなく、したがって無限大になるためです。

上記の出力を提供するsigned char c必要があります。char は基本的に 8 ビット幅の整数ですが、デフォルトではおそらくコンパイラで署名されています。

于 2013-06-23T05:00:05.437 に答える