1. ホーム
  2. c

[解決済み] C言語による16進数文字の印刷

2022-02-18 17:59:10

質問内容

文字列を読み込んで、その文字の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 他の文字にはないのですか?

どのように解決するのですか?

を表示させています。 ffffff なぜなら char はあなたのシステム上で署名されています。C言語では、次のようなvararg関数があります。 printf よりも小さいすべての整数を昇格させます。 int から int . このため char は整数 (この例では 8 ビット符号付き整数) であるため、文字列は int sign-extensionで。

以来 c080 は先頭が1ビットなので(8ビット整数では負)、符号拡張されていますが、他のサンプルでは符号拡張されていません。

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

これが解決策です。

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

これは、上位ビットをマスクして、必要な下位8ビットだけを残すものです。