この人頭いいなと思ったエピソード

VC++でのwindows 64ビットプログラミングを勉強しています。
以下のMSDNのページにたどり着き、サンプルプログラムを作りながら確かめているのですが、
http://msdn.microsoft.com/ja-jp/library/3b2e7499 …

以下の記述の意味がよく分からないので、教えてください。

---ここから---
int と long は、64 ビット Windows オペレーティング システムでは 32 ビット値です。 64 ビット プラットフォーム用にコンパイルする必要があるプログラムでは、ポインターを 32 ビット変数に割り当てないように注意してください。 ポインターは、64 ビットのプラットフォームでは 64 ビットなので、ポインターを 32 ビット変数に割り当てると、ポインター値を切り捨てることになります。
---ここまで---

intとlongのサイズが4バイトでこれは32ビットのときと変わらず、
ポインタのサイズが8バイトに拡張された(これはメモリアドレスが64ビットになったのだから当然)のは理解しているのですが、
http://msdn.microsoft.com/ja-jp/library/94z15h2c …

「ポインターを 32 ビット変数に割り当てる」というのがどういうこと(どういうコード)なのかがわかりません。

こんなことかなとも思ったのですが、これはありえない記述ですよね

===============
int a = 0;
int *pt = NULL;

a = pt;//32ビット変数にポインタを割り当て???(というよりポインタを代入か)

error C2440: '=' : 'int *' から 'int' に変換できません。
1> この変換が可能なコンテキストはありません。
===============

32ビットでは問題にならなくて、64ビットになったから問題になって、どう変えれば問題なくなるのか
という感じで説明していただけると分かりやすいのかな思います。

よろしくお願いします。

A 回答 (2件)

>a = pt;//32ビット変数にポインタを割り当て???(というよりポインタを代入か)



その理解であってますよ。
実際のケースでは

a = (int)pt;

とするでしょうけど。
union {
int value;
void *ptr;
} a;
とすべき所を面倒がってintだけで済ませてしまうような場合ですね。
    • good
    • 0
この回答へのお礼

回答ありがとうございました

お礼日時:2011/11/06 22:45

プログラムのテストなどで「アドレスを%xで表示せよ」と出題されることがあります。



printf("%x\n",&a);/*これは未定義です*/
printf("%x\n",(int)&a);/*アドレスと整数のサイズが同じなら合法です*/
printf("%llx\n",(long long)&a);/*アドレスが64ビット、整数が32ビットの場合これしか方法はありません*/
    • good
    • 0
この回答へのお礼

回答ありがとうございました

お礼日時:2011/11/06 22:46

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