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も見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
printf で二進表示を行いたい。
C言語・C++・C#
-
charでの計算?
C言語・C++・C#
-
構造体のメンバをfor文で回したい
C言語・C++・C#
-
-
4
C言語で構造体のメンバを簡単に出力する方法ありますか?
C言語・C++・C#
-
5
char*を初期化したいのですが
C言語・C++・C#
-
6
0xffffとは?
C言語・C++・C#
-
7
#defineの定数を文字列として読み込む
C言語・C++・C#
-
8
バッファとは何ですか
C言語・C++・C#
-
9
2の補数を計算するプログラム
C言語・C++・C#
-
10
C言語のポインターに関する警告
C言語・C++・C#
-
11
void*型のデータサイズ
C言語・C++・C#
-
12
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
13
#if 1 #elseの意味について
C言語・C++・C#
-
14
C++ 文字列変数と16進数の比較
C言語・C++・C#
-
15
unsigned char配列への入力の仕方
C言語・C++・C#
-
16
C言語のsocket関数で、複数NIC実装PCはどうなるのでしょうか?
C言語・C++・C#
-
17
関数の実体定義にヘッダファイルの2重定義防止方法が効かない?
C言語・C++・C#
-
18
3バイト文字(UTF-8)をprintfで等幅表示をするには?
C言語・C++・C#
-
19
switch文で文字を比較することは出来ませんか?
C言語・C++・C#
-
20
16進数を2文字ずつ配列に格納したい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
【C言語】全角文字の配列を、全...
-
プログラミングの授業の課題です
-
C言語のプログラムで、途中で止...
-
C言語でファイルから複素数の値...
-
終了条件Ctrl+zについて,結果表...
-
空白を含んだ文字列がうまく格...
-
printf による16進表示について
-
警告 W8075 問題のあるポインタ...
-
VC++でSQLへSELECT文を送ったの...
-
C言語でのCSVファイルの読み出...
-
へんな現象
-
#define _CRT_SECURE_NO_WARNIN...
-
マイナスからプラスへ転じた時...
-
*をユーザーが入力した数字の数...
-
2÷3などの余りについて
-
10個出力で改行したいのですが...
-
C言語での奇数の和
-
複数桁10進数の*桁目だけを抽出...
-
正負を反転させて出力するプロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
C言語で複数列のデータを1列の...
-
#defineが使用するメモリ領域に...
-
printf による16進表示について
-
空白を含んだ文字列がうまく格...
-
C言語のプログラムで、途中で止...
-
プログラミングの授業の課題です
-
char型2つを結合し、short型に...
-
C言語でのCSVファイルの読み出...
-
矢印キーを押下してコンソール...
-
【C言語】全角文字の配列を、全...
-
エラーについて質問です。
-
リストの作成と出力(C言語)
-
バイナリファイル(画像)のよみ...
-
[C]セグメンテーションエラー:...
-
WinInetのInternetOpenUrl関数...
-
c言語で文書を読み込み、単語の...
-
VC++でSQLへSELECT文を送ったの...
-
受信データから必要な部分のみ...
-
reallocでエラー
おすすめ情報