UTF-8とc言語についての質問です。 char str[] = "4月"; printf("%x %x %x %x\n", str[0], str[1], str[2], str[3]); return 0; 結果 34 ffffffe6 ffffff9c ffffff88

C言語関連39閲覧

ベストアンサー

1

1人がナイス!しています

>ffffffが先頭につくのはなぜでしょうか。 int型データに拡張されて表示されるから。 printfの%xは引数にint型を要求します。 printfにint型未満の整数型を引数として渡すと、int型に暗黙変換されて渡されます。この時にchar型(普通は符号付き8ビット整数)で最上位ビットが1の場合、整数値としてはマイナスですので、これをint型に変換するとマイナスとして表現するために上位バイトがffで埋められる事が原因です。 unsigned char型(普通は符号なし8ビット整数)にすると、常に正数扱いなので、int型に拡張されても上位バイトは0なので、表示されません。

ThanksImg質問者からのお礼コメント

丁寧にありがとうございますmーーm

お礼日時:4/18 15:29

その他の回答(5件)

1

>ffffffが先頭につくのはなぜでしょうか。 %xはint型を16進数で表示する指定子なのでchar型はint型に変換されてから表示されます。 例: char str[] = "4月"; char *p; p=str; while(*p != '\0'){ printf("%x ",*p & 0xff); p++; }

1人がナイス!しています

1

%x で出力しているため、(unsigned int)str[1] が出力されているからです。 str[1] は負の数なので、unsigned int に型変換すると、非常に大きな数になります。 したがって、上位に f が並びます。 正しい出力方法は、%hhx で、(unsigned char)str[1] です。 他も同様.

1人がナイス!しています

1

それぞれの文字コードの最上位ビットが1になっているので、数値と扱う場合マイナス値になります。 %xで16進表示する場合(おそらく)int拡張されて4バイト分の表示になるので、余分なffffffがつくのでしょう。 unsigned charにすれば1バイト分のみ表示されます。

1人がナイス!しています

0

printfは可変長引数をとるので、char型の値はintに変換されます。 この時点でcharで0xe6だったものがintの0xffffffe6に変換されます。 そして%xを指定しているので、その値がint型の値として出力されています。