アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (5件)

リトルエンディアン(Little Endian)とビッグエンディアン(Big Endian)という言葉をご存じでしょうか。


2バイト以上のデータ量の数値データの記録方式にはリトルエンディアン(最下位のバイトから記録します。Intel系のプロセッサがこの記録方式です。)とビッグエンディアン(リトルエンディアンと逆で、最上位のバイトから記録します。Motorola系のプロセッサがこの記録方式です。)があります。

0a 00 ?? ??となったのはIntel系のプロセッサだからです。??と書いたのは、ここには何が来るか不明だからです。00 00 00 0aを期待していますが、int intdate=10;としているので結果は2バイトですよね。
ビッグエンディアンを期待するのであれば、00 0a ?? ??です。
    • good
    • 1

再び #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 バイトです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/05/14 19:11

それで正しいです。



というのは、Intel系のCPUではメモリ上のデータ並びがひっくり返るからです。

4バイトの変数型では、0x12345678という値はメモリ上では0x78 0x56 0x34 0x12という並びになります。

2バイトの変数型では、0x1234という値はメモリ上では0x34 0x12という並びになります。
    • good
    • 0

おっとすいません。

#1 です。

> unsigned char **intptr;
> にしておいたほうが無難です。

↓訂正

unsigned char *intptr;
にしておいたほうが無難です。
    • good
    • 0

正しい実行結果です。


Intel 系の CPU では数値をメモリ上に格納する場合、
下位バイトから順に格納されます。

こういう格納の仕方を「リトルエンディアン」と言います

> char *intptr;

unsigned char **intptr;
にしておいたほうが無難です。
理由は、
int intdata=0xff;
などとしてみれば分かると思います。

参考URL:http://www.atmarkit.co.jp/icd/root/00/49717200.h …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!