文字列を読み取り、その文字に相当する 16 進数を出力しようとしています。
たとえば、"0xc0 0xc0 abc123"
最初の2文字がc0
16進数で残りの文字がabc123
ASCIIである文字列がある場合、次のようになります。
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 ビットのみが保持されます。