
こんにちは。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;
}
No.4ベストアンサー
- 回答日時:
★アドレスをとにかく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 ですか。
・まぁ、とにかく整数型へキャストしてから桁数を丸め込んで表示するのが基本の考えです。
・以上。おわり。
No.3
- 回答日時:
通常、printf系の関数でアドレスを表示させるときは %p を使います
printf("%p %ld\n",pa,*pa);
特定の型で表現可能な範囲まで削るにはキャストすることになります。
printf("%04hX %ld\n", (unsigned short)pa, *pa);
printf("%08lX %ld\n", (unsigned long)pa, *pa);
ご回答ありがとうございます。
>通常、printf系の関数でアドレスを表示させるときは %p を使います
勉強してまもないので、知りませんでした。ありがとうございました。

No.2
- 回答日時:
>ところでアドレスの件ですが、テキストの問題でアドレスを削るようにしているのです。
Windowsだと正常に動作するのですが、テキスト通りに実行させるにはどうしたらいいでしょうか?強引にアドレスをけずるには、以下のようにします。
printf("%04x %ld\n",pa,*pa); を
printf("%04x %ld\n",(0xffff & (int)pa),*pa);
のようにします。
ポインター paを強引にint型の変数にして、0xffffでアンドをとります。
これで、下位2バイトだけが、そのままで、上位の2バイトが0になります。そして、下位2バイトの値だけが、表示されるようになります。
No.1
- 回答日時:
アドレスの桁数は、そのハードウェアによって異なります。
8bitなら16進数で2桁、以後16bit, 32bit, 64bitと増えるごとに倍になります。
7桁なら、32bitか64bitマシンで、上位の0が削られたのでしょう。
無理やり4桁に削ってもよいのですが、それは正しくないアドレスですよ?「そんなものだ」と納得してください。
ご回答ありがとうございます。
>7桁なら、32bitか64bitマシンで、上位の0が削られたのでしょう。
なるほど。そういう理由なんですね。わかりました。
ところでアドレスの件ですが、テキストの問題でアドレスを削るようにしているのです。Windowsだと正常に動作するのですが、テキスト通りに実行させるにはどうしたらいいでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンパイルエラーについて
-
C言語で四則演算を使って10を作...
-
H8マイコンCでprintf/scanfが使...
-
CPU温度・負荷等を調べるには
-
コマンドラインに出力した文字...
-
「%n」や「%S」は何故恥ずかし...
-
ピラミッド表示プログラム。
-
コマンドプロンプトがすぐ消える
-
ホームページをC言語で作りたい...
-
C言語で 選択肢: |?| |?| |?| 1...
-
clock()関数の誤差
-
C++を使ってのテイラー展開
-
最早開始時間と最遅完了時刻を...
-
20'(角度)の計算がわかりま...
-
信頼区間の1.96や1.65ってどこ...
-
Aの値からBの値を除するとは??
-
数字以外が入力されたらエラー...
-
値差の%計算方法について
-
「Aに対するBの割合」と「Aに対...
-
#defineが使用するメモリ領域に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
コンパイルエラーについて
-
CTRL+Dでループを抜けるには
-
Cプログラムについて
-
コマンドラインに出力した文字...
-
WM_CLOSEで閉じれないウィンド...
-
C言語の&に関する質問
-
すごろくに使用するサイコロ
-
文字と数字の判定について
-
printf( " %2d", p * q );
-
【C言語教えてください】sin波...
-
%P と %X の違い
-
C言語の勉強しています。すみま...
-
strcmp
-
c言語でAからZまでを表示する...
-
unsigned int型について
-
(C言語)めちゃくちゃな値にな...
-
printf で二進表示を行いたい。
-
プログラミング C言語 課題でプ...
-
c言語で2000年以降カレンダーを...
おすすめ情報