printfでchar型の値を2桁の16進数で出力する
C言語で1バイト単位で数値を扱うためにchar型を使用した.その時にprintfで2桁の16進数として出力しようとすると0x80を以上の値は以下のプログラムだとうまくいかない.
#include <stdio.h> int main(){ int i = 0; char str[] = {'a', 'z', 0xCC, 0x34, 0x80, 0x7F '\0'}; for(i = 0; str[i] != '\0'; i++){ printf("0x%02X ", str[i]); } return 0; }
実行結果
0x61 0x7A 0xFFFFFFF8 0x34 0xFFFFFF80 0x7F
こんな感じで4バイト表記になってしまう.
これは(多分)char型の値域は-128〜127なので,str[i]が負数扱いになってその後4バイトにキャストされているのが原因じゃないかと予測.
というわけで一旦符号なしの整数(unsigned int)にキャストしてやることで解決,すると思いきや先と同じ結果に.
どうやらunsigned intの値域に負数はないなので結局同じ結果になってしまうようだ.
しかたないので負数のデータサイズ拡張時には拡張されたビットは全て1で埋められるので,以下のようにして解決した.
#include <stdio.h> int main(){ int i = 0; char str[] = {'a', 'z', 0xCC, 0x34, 0x80, 0x7F, '\0'}; for(i = 0; str[i] != '\0'; i++){ printf("0x%02X ", str[i] & 0x000000FF); } return 0; }
実行結果
0x61 0x7A 0xCC 0x34 0x80 0x7F
なんかもっと良い解決方法がある気がする.