アプリ版:「スタンプのみでお礼する」機能のリリースについて

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'が付加したものがいくつか出力されてしまいます。
これはどういった意味を持つのでしょうか?

なんか初心者ならではの漠然とした質問ですいません。。。

A 回答 (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);
にするかどちらかですね。
    • good
    • 2
この回答へのお礼

回答ありがとうございます。

質問時に適当なイメージで出力値にffffffを付加してましたが、実際には0x80~0xff
のみそうなるんですね。

>このCコンパイラの場合は、int が4バイトcharが1バイトのため、
>上位3バイトに負の数を示すffffffが入ります。

これまたとても参考になります。
そういえばコンパイルの際にそういうワーニングが出ていたような・・・。

みなさん、ご親切に本当にありがとうございました。

お礼日時:2004/05/20 10:09

家の環境では出力は


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 …
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

お礼日時:2004/05/20 10:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A