- ベストアンサー
printf による16進表示について
C言語初心者です。 今作っているプログラムで、データを16進形式で表示しようとしています。 大体このような感じです。 /*入力時*/ char buf[5]={0x4e,0x94,0xa0,0x2b,0x78} /*出力時*/ for (i = 0; i < 5; i++) { printf("0x%02x\n",buf[i]) } 実際には入力後にある処理によってbufは更新されるのですが、printfの出力結果として、 0xffffff4e 0x94 0xffffffa0 0x2b 0x78 というように、'ffffff'が付加したものがいくつか出力されてしまいます。 これはどういった意味を持つのでしょうか? なんか初心者ならではの漠然とした質問ですいません。。。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
出力は、 0x4e 0xffffff94 0xffffffa0 0x2b 0x78 ではありませんか? char が符号付(-128~127)のため、0x80~0xffは負の数とみなされます。printfの引数になる時に 符号付charは符号付intに変換されますが、このCコンパイラの場合は、int が4バイトcharが1バイトのため、上位3バイトに負の数を示すffffffが入ります。 char x=255; printf("%d\n",x); だと255でなく、-1が表示されます。 対応としては、 unsingned char buf[5]={0x4e,0x94,0xa0,0x2b,0x78} ; とするか、 printf("0x%02x\n",buf[i]&0xff); にするかどちらかですね。
その他の回答 (1)
- kmb01
- ベストアンサー率45% (63/138)
家の環境では出力は 0x4e 0xffffff94 0xffffffa0 0x2b 0x78 となりました。 ffffffの意味は、それが負の数であることを表しています。 2進数で負の数を表すための2の補数表現について調べてみてください。 ffffffを表示したくない場合は unsigned char buf[5]; とするか、 printf("0x%02x\n",buf[i] & 0xff); とすればいいと思います。
お礼
ありがとうございます。 負の数ということだったんですね。 納得がいきました。 とてもとても助かりました。
お礼
回答ありがとうございます。 質問時に適当なイメージで出力値にffffffを付加してましたが、実際には0x80~0xff のみそうなるんですね。 >このCコンパイラの場合は、int が4バイトcharが1バイトのため、 >上位3バイトに負の数を示すffffffが入ります。 これまたとても参考になります。 そういえばコンパイルの際にそういうワーニングが出ていたような・・・。 みなさん、ご親切に本当にありがとうございました。