変数の中身を16進数で1バイトずつダンプするにはどんなプログラムを作ったらいいのでしょうか?
ためしに、こんなプログラムを作ってみました。
#include <stdio.h>
int main()
{
int intdata=10;
char *intptr;
intptr=&intdata;
printf("%02x %02x %02x %02x\n", *intptr,*(iniptr+1),*(intptr+2),*(intptr+3));
return 0;
}
ところが、これでは実行結果が、
0a 00 00 00
となって、思い通りに出力されていないように思います。これは何かプログラムに問題があるのでしょうか?それともこの実行結果でよいのでしょうか?
僕は、 00 00 00 0aと表示されるかと思っていたのですが・・・。
No.4ベストアンサー
- 回答日時:
リトルエンディアン(Little Endian)とビッグエンディアン(Big Endian)という言葉をご存じでしょうか。
2バイト以上のデータ量の数値データの記録方式にはリトルエンディアン(最下位のバイトから記録します。Intel系のプロセッサがこの記録方式です。)とビッグエンディアン(リトルエンディアンと逆で、最上位のバイトから記録します。Motorola系のプロセッサがこの記録方式です。)があります。
0a 00 ?? ??となったのはIntel系のプロセッサだからです。??と書いたのは、ここには何が来るか不明だからです。00 00 00 0aを期待していますが、int intdate=10;としているので結果は2バイトですよね。
ビッグエンディアンを期待するのであれば、00 0a ?? ??です。
No.5
- 回答日時:
再び #1 です。
void dump(void* p, int cb);
16 進ダンプを表示する。
p : 変数(メモリ領域)の先頭へのポインタ
cb : 変数(メモリ領域)のサイズ
のような関数を作っておいて、
int intdata = 10;
double doubledata = 10.0;
dump(&intdata, sizeof(intdata));
dump(&doubledata, sizeof(doubledata));
という風に呼び出すことにすれば便利そうじゃないですか?
# ちなみに、
# int 型のサイズは処理系依存です。
# (よほど古いものでない) VC++ や BCC なら 4 バイトです。
皆さん回答ありがとうございます。
だけど、どうしてIntelはこんなことをしたのでしょうか?
ビッグエンディアンとかリトルエンディアンとかをして、どのような得があるのでしょうか?教えてくださればうれしいです。
No.3
- 回答日時:
それで正しいです。
というのは、Intel系のCPUではメモリ上のデータ並びがひっくり返るからです。
4バイトの変数型では、0x12345678という値はメモリ上では0x78 0x56 0x34 0x12という並びになります。
2バイトの変数型では、0x1234という値はメモリ上では0x34 0x12という並びになります。
No.2
- 回答日時:
おっとすいません。
#1 です。> unsigned char **intptr;
> にしておいたほうが無難です。
↓訂正
unsigned char *intptr;
にしておいたほうが無難です。
No.1
- 回答日時:
正しい実行結果です。
Intel 系の CPU では数値をメモリ上に格納する場合、
下位バイトから順に格納されます。
こういう格納の仕方を「リトルエンディアン」と言います
> char *intptr;
unsigned char **intptr;
にしておいたほうが無難です。
理由は、
int intdata=0xff;
などとしてみれば分かると思います。
参考URL:http://www.atmarkit.co.jp/icd/root/00/49717200.h …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
allocってなんですか?
-
構造体でchar name[]と*nameの...
-
c言語のポインタへの文字列入力...
-
ビットをローテートするプログ...
-
malloc呼び出し時のセグメンテ...
-
void*型のデータサイズ
-
ヒープメモリの解放について
-
16進ダンプのプログラム
-
stringの最大サイズ
-
配列の添え字の最大数とは?
-
行数の変動にも対応したファイ...
-
128ビット変数の符合表現について
-
C++で、メンバもヒープに確保さ...
-
fread関数および動的なメモリ確...
-
LoadLibraryでAccess Violation...
-
newしないオブジェクトについて
-
malloc でのメモリ取得状況の可...
-
入れ子になった構造体について
-
C言語 mallocとfreeについて
-
スタック破壊の上手な見つけ方...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
ヒープメモリの解放について
-
stringの最大サイズ
-
void*型のデータサイズ
-
ビットをローテートするプログ...
-
malloc呼び出し時のセグメンテ...
-
スタック破壊の上手な見つけ方...
-
C++のnewで確保したメモリーの...
-
配列の添え字の最大数とは?
-
プログラムが途中で強制終了し...
-
DLLのマルチスレッドの動作につ...
-
free関数で動作が止まる
-
mallocで確保するメモリの領域...
-
グローバル変数のサイズ
-
malloc でのメモリ取得状況の可...
-
デストラクタを呼びたい
-
メモリ不足になってしまう。
-
HEAP に関すること
おすすめ情報