5

私はCを学ぼうとしていますが、今は文字を学んでいます。その文字が署名されていても署名されていなくてもよい場所をいくつか読んだことがあります。この部分は得られますが、unsigned char(0〜255の値を保持できると思いました)を使用すると

printf("%c", 400); 

あるいは

printf("%c\n", (unsigned char)400);

それはÉ

どうしてこれなの?

4

2 に答える 2

5

C99 規格によると、フォーマットc指定子が長さ修飾子printfなしで提供されている場合、l

int引数は に変換され、unsigned char結果の文字が書き込まれます。

unsigned charこれは、400が400 % 256、またはに変換されることを意味し144ます。すると、対応する文字144が書き出されます。これはUNICODE 制御シーケンスであるため、表示されるÉ文字はシステムに依存します。

于 2012-12-30T14:27:33.547 に答える
1
unsigned char c = 400;
printf("%d",c);

何を推測すると、144印刷されます。でオーバーフローが発生したためcです。

Anunsigned charは (ほぼすべてのプラットフォームで) 正確に 8 ビットのメモリを使用するため、00000000 (0) ~ 11111111 (255) の範囲の変数になります。バイナリで 8 ビットを超える数値を unsigned char に割り当てようとすると、左側の余分なビットがオーバーフローして失われます。

あなたの場合、unsigned char に 400 を割り当てようとしました:

400 = 110010000は 9 ビットなので、最上位の 1 が失われ、実際には10010000が char に割り当てられます。これは 10 進数で 144 です。

として印刷すると%d、次のようになります144。として印刷すると%c拡張ASCIIコードÉの144番目の文字が表示されます(あなたの場合)。

于 2012-12-30T14:31:27.177 に答える