C言語で16進文字を印刷する 質問する

C言語で16進文字を印刷する 質問する

文字列を読み取り、その文字に相当する 16 進数を出力しようとしています。

たとえば、"0xc0 0xc0 abc123"最初の2文字がc016進数で残りの文字がabc123ASCIIである文字列がある場合、次のようになります。

c0 c0 61 62 63 31 32 33

しかし、printf使用すること%x

ffffffc0 ffffffc0 61 62 63 31 32 33

を使わずに、必要な出力を得るにはどうすればよいですか"ffffff"? また、c0 (および 80) だけに がありffffff、他の文字には がないのはなぜですか?

ベストアンサー1

ffffffはシステム上で符号付きであるため、 が表示されていますchar。C では、 などの vararg 関数は、printfより小さいすべての整数を に昇格しますint。は整数 (この場合は 8 ビット符号付き整数) であるintため、文字は符号拡張によって にchar昇格されます。int

c0および は80先頭に 1 ビットがあるため(8 ビット整数としては負)、これらは符号拡張されていますが、サンプル内の他のものは符号拡張されていません。

char    int
c0 -> ffffffc0
80 -> ffffff80
61 -> 00000061

解決策は次のとおりです:

char ch = 0xC0;
printf("%x", ch & 0xff);

これにより、上位ビットがマスクされ、必要な下位 8 ビットのみが保持されます。

おすすめ記事