プロが教えるわが家の防犯対策術!

こんにちは。C言語の学習を始めたばかりの社会人です。
下記のソースコードを実行すると、
「009e 10
 00a2 35
00a6 25
00aa 67
00ae 88
00b2 29」
というイメージ表示されるはずなのですが、アドレスが別な値になるのは仕方ないとして、アドレスを4桁で表示しようとしても7桁くらいで表示されてしまいます。Unixサーバを使用しています。
どうすればよろしいでしょうか?
ご回答頂ければありがたいです。

#include<stdio.h>

int main()
{
static long a[]={10L,35L,25L,67L,88L,29L,-999L};
long *pa;
pa=a;
while(*pa!=-999L){
printf("%04x %ld\n",pa,*pa);
pa++;
}
printf("\n");
return 0;
}

A 回答 (4件)

アドレスの桁数は、そのハードウェアによって異なります。


8bitなら16進数で2桁、以後16bit, 32bit, 64bitと増えるごとに倍になります。

7桁なら、32bitか64bitマシンで、上位の0が削られたのでしょう。
無理やり4桁に削ってもよいのですが、それは正しくないアドレスですよ?「そんなものだ」と納得してください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>7桁なら、32bitか64bitマシンで、上位の0が削られたのでしょう。

なるほど。そういう理由なんですね。わかりました。
ところでアドレスの件ですが、テキストの問題でアドレスを削るようにしているのです。Windowsだと正常に動作するのですが、テキスト通りに実行させるにはどうしたらいいでしょうか?

お礼日時:2007/02/01 19:42

>ところでアドレスの件ですが、テキストの問題でアドレスを削るようにしているのです。

Windowsだと正常に動作するのですが、テキスト通りに実行させるにはどうしたらいいでしょうか?

強引にアドレスをけずるには、以下のようにします。
printf("%04x %ld\n",pa,*pa); を
printf("%04x %ld\n",(0xffff & (int)pa),*pa);
のようにします。
ポインター paを強引にint型の変数にして、0xffffでアンドをとります。
これで、下位2バイトだけが、そのままで、上位の2バイトが0になります。そして、下位2バイトの値だけが、表示されるようになります。
    • good
    • 0
この回答へのお礼

なるほどぉ。
ご回答ありがとうございました。

お礼日時:2007/02/03 17:37

通常、printf系の関数でアドレスを表示させるときは %p を使います


printf("%p %ld\n",pa,*pa);

特定の型で表現可能な範囲まで削るにはキャストすることになります。
printf("%04hX %ld\n", (unsigned short)pa, *pa);
printf("%08lX %ld\n", (unsigned long)pa, *pa);
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>通常、printf系の関数でアドレスを表示させるときは %p を使います

勉強してまもないので、知りませんでした。ありがとうございました。

お礼日時:2007/02/03 17:39

★アドレスをとにかく4桁で表示したいのですか?


・それならば、アドレスを一度 int 型の整数値にキャストしてから 16進 4桁に AND するのが基本です。
・方法は既に tatsu99 さん、tea_sheep さんが回答を出していますので、printf 関数の書式文字列に
 ついて少しアドバイスします。
・通常アドレスを表示する書式制御は『%p』です。→tea_sheep さんの助言どおりですね。
・それで、『%X』や『%x』を使って 16進 4桁にするには精度を指定すればよいのです。
 つまり、『%04X』を『%04.4X』とピリオドと最大桁数を指定します。
 これで、『pa』を unsigned long や unsigned short などにキャストするだけですみます。

方法1:
printf( "%04.4x %ld\n", (unsigned int)pa, *pa );

方法2:
printf( "%04x %ld\n", (unsigned short)pa, *pa );

方法3:
printf( "%04x %ld\n", ((unsigned int)pa & 0xFFFF), *pa );

最後に:
・コンパイラの int 幅が 64 ビット長の場合は (unsigned int) を (__w64) とキャストして下さい。
 つまり、
 方法1:printf( "%04.4x %ld\n", (__w64)pa, *pa );
 方法2:printf( "%04x %ld\n", (unsigned short)(__w64)pa, *pa );
 方法3:printf( "%04x %ld\n", ((__w64)pa & 0xFFFF), *pa );
 となります。
・なお、(__w64)は、私の使っているコンパイラの定義でのお話ですのでお使いのコンパイラの 64 ビット
 整数のキャスト演算子を指定します。→Windows.h ヘッダを include していると (INT64) でもキャスト
 可能ですが、質問者さんは Unix の OS ですか。
・まぁ、とにかく整数型へキャストしてから桁数を丸め込んで表示するのが基本の考えです。
・以上。おわり。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
いろいろとお教えいただき、ありがとうございました。

お礼日時:2007/02/03 17:41

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