• ベストアンサー

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'が付加したものがいくつか出力されてしまいます。 これはどういった意味を持つのでしょうか? なんか初心者ならではの漠然とした質問ですいません。。。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.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); にするかどちらかですね。

orange777
質問者

お礼

回答ありがとうございます。 質問時に適当なイメージで出力値にffffffを付加してましたが、実際には0x80~0xff のみそうなるんですね。 >このCコンパイラの場合は、int が4バイトcharが1バイトのため、 >上位3バイトに負の数を示すffffffが入ります。 これまたとても参考になります。 そういえばコンパイルの際にそういうワーニングが出ていたような・・・。 みなさん、ご親切に本当にありがとうございました。

その他の回答 (1)

  • kmb01
  • ベストアンサー率45% (63/138)
回答No.1

家の環境では出力は 0x4e 0xffffff94 0xffffffa0 0x2b 0x78 となりました。 ffffffの意味は、それが負の数であることを表しています。 2進数で負の数を表すための2の補数表現について調べてみてください。 ffffffを表示したくない場合は unsigned char buf[5]; とするか、 printf("0x%02x\n",buf[i] & 0xff); とすればいいと思います。

参考URL:
http://www.google.com/search?num=50&lr=lang_ja&q=2%E3%81%AE%E8%A3%9C%E6%95%B0
orange777
質問者

お礼

ありがとうございます。 負の数ということだったんですね。 納得がいきました。 とてもとても助かりました。