こんにちは。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.1
- 回答日時:
アドレスの桁数は、そのハードウェアによって異なります。
8bitなら16進数で2桁、以後16bit, 32bit, 64bitと増えるごとに倍になります。
7桁なら、32bitか64bitマシンで、上位の0が削られたのでしょう。
無理やり4桁に削ってもよいのですが、それは正しくないアドレスですよ?「そんなものだ」と納得してください。
ご回答ありがとうございます。
>7桁なら、32bitか64bitマシンで、上位の0が削られたのでしょう。
なるほど。そういう理由なんですね。わかりました。
ところでアドレスの件ですが、テキストの問題でアドレスを削るようにしているのです。Windowsだと正常に動作するのですが、テキスト通りに実行させるにはどうしたらいいでしょうか?
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.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.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 ですか。
・まぁ、とにかく整数型へキャストしてから桁数を丸め込んで表示するのが基本の考えです。
・以上。おわり。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript jQueryで同じクラス名のものを別物として扱いたい 1 2022/06/17 14:14
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# (C言語)めちゃくちゃな値になってしまいます。 5 2022/08/13 11:55
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- 化学 化学の混合気体の状態方程式 3 2022/11/15 21:21
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
4の倍数を論理演算で表す。。
-
10個出力で改行したいのですが...
-
hit&bolwのプログラミングがで...
-
defineで定数が置き換えられな...
-
strcmp
-
c言語 プログラム ピラミッド
-
コンパイルすると『breakの位置...
-
パスカルの三角形についてのCプ...
-
C言語での、年複利の計算方法...
-
if文がコンパイルエラーを起こ...
-
Cでオセロゲームプログラム
-
コンパイルエラーについて
-
困ってます!Cプログラミングに...
-
error C2143: 構文エラー : ';'...
-
C言語です このプログラミング...
-
平均合計偏差値標準偏差の出し方
-
Cプログラミングのアルゴリズム...
-
C言語についてです学籍番号、名...
-
円の面積を求めるプログラミン...
-
コマンドプロンプトがすぐ消える
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
既約分数の表示プログラム
-
printf で二進表示を行いたい。
-
8人分のテストの点数を入力し、...
-
printf( " %2d", p * q );
-
strcmp
-
CTRL+Dでループを抜けるには
-
4の倍数を論理演算で表す。。
-
%P と %X の違い
-
【C言語教えてください】sin波...
-
c言語でAからZまでを表示する...
-
cshの文字列操作(0埋め)
-
万年カレンダーのC言語プログラ...
-
コマンドラインに出力した文字...
-
scanfに文字が入力されたときに...
-
コンパイルエラーについて
-
ホームページをC言語で作りたい...
-
改行について 1行に何個かづ...
-
台形の面積を求めるプログラム
-
なぜgccはstdio.hをインクルー...
おすすめ情報