• ベストアンサー

16進ダンプのプログラム

変数の中身を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と表示されるかと思っていたのですが・・・。

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

  • ベストアンサー
  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.4

リトルエンディアン(Little Endian)とビッグエンディアン(Big Endian)という言葉をご存じでしょうか。 2バイト以上のデータ量の数値データの記録方式にはリトルエンディアン(最下位のバイトから記録します。Intel系のプロセッサがこの記録方式です。)とビッグエンディアン(リトルエンディアンと逆で、最上位のバイトから記録します。Motorola系のプロセッサがこの記録方式です。)があります。 0a 00 ?? ??となったのはIntel系のプロセッサだからです。??と書いたのは、ここには何が来るか不明だからです。00 00 00 0aを期待していますが、int intdate=10;としているので結果は2バイトですよね。 ビッグエンディアンを期待するのであれば、00 0a ?? ??です。

すると、全ての回答が全文表示されます。

その他の回答 (4)

noname#5537
noname#5537
回答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 バイトです。

noname#129397
質問者

お礼

 皆さん回答ありがとうございます。  だけど、どうしてIntelはこんなことをしたのでしょうか?  ビッグエンディアンとかリトルエンディアンとかをして、どのような得があるのでしょうか?教えてくださればうれしいです。

すると、全ての回答が全文表示されます。
noname#6581
noname#6581
回答No.3

それで正しいです。 というのは、Intel系のCPUではメモリ上のデータ並びがひっくり返るからです。 4バイトの変数型では、0x12345678という値はメモリ上では0x78 0x56 0x34 0x12という並びになります。 2バイトの変数型では、0x1234という値はメモリ上では0x34 0x12という並びになります。

すると、全ての回答が全文表示されます。
noname#5537
noname#5537
回答No.2

おっとすいません。#1 です。 > unsigned char **intptr; > にしておいたほうが無難です。 ↓訂正 unsigned char *intptr; にしておいたほうが無難です。

すると、全ての回答が全文表示されます。
noname#5537
noname#5537
回答No.1

正しい実行結果です。 Intel 系の CPU では数値をメモリ上に格納する場合、 下位バイトから順に格納されます。 こういう格納の仕方を「リトルエンディアン」と言います > char *intptr; unsigned char **intptr; にしておいたほうが無難です。 理由は、 int intdata=0xff; などとしてみれば分かると思います。

参考URL:
http://www.atmarkit.co.jp/icd/root/00/49717200.html
すると、全ての回答が全文表示されます。

関連するQ&A