変数の中身を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.1
- 回答日時:
正しい実行結果です。
Intel 系の CPU では数値をメモリ上に格納する場合、
下位バイトから順に格納されます。
こういう格納の仕方を「リトルエンディアン」と言います
> char *intptr;
unsigned char **intptr;
にしておいたほうが無難です。
理由は、
int intdata=0xff;
などとしてみれば分かると思います。
参考URL:http://www.atmarkit.co.jp/icd/root/00/49717200.h …
No.2
- 回答日時:
おっとすいません。
#1 です。> unsigned char **intptr;
> にしておいたほうが無難です。
↓訂正
unsigned char *intptr;
にしておいたほうが無難です。
No.3
- 回答日時:
それで正しいです。
というのは、Intel系のCPUではメモリ上のデータ並びがひっくり返るからです。
4バイトの変数型では、0x12345678という値はメモリ上では0x78 0x56 0x34 0x12という並びになります。
2バイトの変数型では、0x1234という値はメモリ上では0x34 0x12という並びになります。
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はこんなことをしたのでしょうか?
ビッグエンディアンとかリトルエンディアンとかをして、どのような得があるのでしょうか?教えてくださればうれしいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
mallocについて
-
C言語 mallocとfreeについて
-
newしないオブジェクトについて
-
C++で、メンバもヒープに確保さ...
-
スタック破壊の上手な見つけ方...
-
HEAP に関すること
-
構造体でchar name[]と*nameの...
-
ビットをローテートするプログ...
-
C++のnewで確保したメモリーの...
-
OpenCV cvLoadImageについて
-
配列の添え字の最大数とは?
-
allocってなんですか?
-
メモリ不足になってしまう。
-
ヒープメモリの解放について
-
画像を読み込む配列の確保。
-
MSDNがgethostbynameではなくge...
-
malloc呼び出し時のセグメンテ...
-
C言語 配列の長さの上限
-
セグメントエラー
-
ファイル名「1.jpg ~10.jpg~...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mallocについて
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
ヒープメモリの解放について
-
C++で、メンバもヒープに確保さ...
-
MSDNがgethostbynameではなくge...
-
プログラムが途中で強制終了し...
-
配列の添え字の最大数とは?
-
Accessで、メモリを開放するタ...
-
ヒープ領域の限界値設定
-
malloc呼び出し時のセグメンテ...
-
スタック破壊の上手な見つけ方...
-
C言語 mallocとfreeについて
-
指定したメモリアドレスの値の...
-
stringの最大サイズ
-
16進ダンプのプログラム
-
64ビットと32ビットの違い
-
入れ子になった構造体について
-
free関数で動作が止まる
おすすめ情報