

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'が付加したものがいくつか出力されてしまいます。
これはどういった意味を持つのでしょうか?
なんか初心者ならではの漠然とした質問ですいません。。。
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);
にするかどちらかですね。
回答ありがとうございます。
質問時に適当なイメージで出力値にffffffを付加してましたが、実際には0x80~0xff
のみそうなるんですね。
>このCコンパイラの場合は、int が4バイトcharが1バイトのため、
>上位3バイトに負の数を示すffffffが入ります。
これまたとても参考になります。
そういえばコンパイルの際にそういうワーニングが出ていたような・・・。
みなさん、ご親切に本当にありがとうございました。
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 …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- Visual Basic(VBA) 空白のセルを変更しようとした時(アクティブセル)に インプットボックスを5回出す インプットボックス 1 2023/03/14 11:01
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
strtok
-
#defineが使用するメモリ領域に...
-
プログラミングの授業の課題です
-
VC++2008Enterpriseでwinsockを...
-
算術型変換について
-
空白を含んだ文字列がうまく格...
-
C言語で複数列のデータを1列の...
-
char型2つを結合し、short型に...
-
【C言語】全角文字の配列を、全...
-
WinInetのInternetOpenUrl関数...
-
C言語
-
構造体の各メンバにfor文からア...
-
「Aに対するBの割合」と「Aに対...
-
C言語での引数の省略方法
-
ラグランジュの補間法のCプログ...
-
10個出力で改行したいのですが...
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
なぜCSQとCIP形式ではコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
【C言語】全角文字の配列を、全...
-
#defineが使用するメモリ領域に...
-
C言語で複数列のデータを1列の...
-
printf による16進表示について
-
char型2つを結合し、short型に...
-
空白を含んだ文字列がうまく格...
-
矢印キーを押下してコンソール...
-
C++で指定文字列のカウント方法...
-
コマンドファイルから、ビット...
-
C言語のプログラムで、途中で止...
-
終了条件Ctrl+zについて,結果表...
-
配列への文字列の格納について
-
困ってます!書き方がわかりま...
-
ファイルから数字列を16進数の...
-
fread(),fwrite()等について
-
0x8, スペース, 0x8をプログラ...
-
static付き宣言の初期化
-
構造体メンバの初期化
-
c言語で文書を読み込み、単語の...
おすすめ情報