私はCを学ぼうとしていますが、今は文字を学んでいます。その文字が署名されていても署名されていなくてもよい場所をいくつか読んだことがあります。この部分は得られますが、unsigned char(0〜255の値を保持できると思いました)を使用すると
printf("%c", 400);
あるいは
printf("%c\n", (unsigned char)400);
それはÉ
どうしてこれなの?
C99 規格によると、フォーマットc
指定子が長さ修飾子printf
なしで提供されている場合、l
int
引数は に変換され、unsigned char
結果の文字が書き込まれます。
unsigned char
これは、400が400 % 256
、またはに変換されることを意味し144
ます。すると、対応する文字144
が書き出されます。これはUNICODE 制御シーケンスであるため、表示されるÉ
文字はシステムに依存します。
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番目の文字が表示されます(あなたの場合)。