2011-08-25 19 views
6

私は64ビットLinuxでC++を使用していますが、コンパイラ(g ++)も64ビットです。整数などの変数のアドレスを出力すると、64ビット整数を出力することになっていますが、実際には48ビット整数を出力します。64ビットマシン上のC++ポインタ

int i; 
cout << &i << endl; 

output: 0x7fff44a09a7c 

他の2バイトはどこにあるのでしょうか。お待ちしております。

ありがとうございます。

+0

数は 'どのように多くのビットを持っている '1'のでしょうか? 'uint32_t x = 1;'に十分なビットがないと不平を言うでしょうか? 'sizeof(* int)'をチェックするべきです。 –

答えて

7

ほとんどのC++実装でアドレスを表示すると、先行ゼロが表示されにくくなります。 0x00000000000013fdのようなものは本当に価値がありません。

現在のAMD64アーキテクチャでは、48bitの仮想アドレス空間が定義されているだけです(Linuxの場合はcat /proc/cpuinfoなど)

楽しみのために
+0

このウィキペディア(ええ、私が知っている)の記事では、アーキテクチャーの定義では最大64ビットが許されていますが、現在の実装では48ビットしか使用できません。 http://en.wikipedia.org/wiki/Amd64#Architectural_features – AndrzejJ

+0

@AndrzejJ「64ビット」アーキテクチャであり、名目上ポインタは64ビットです。現在のところ、256TBの仮想アドレス空間では十分であり、すべてのポインタの上位16ビットがゼロであると仮定することができれば、電線(したがって電力)を節約できます。 – Voo

3

彼らはそこにいます - 彼らはどこにも行っていません - それはストリームの書式設定だけです。先行ゼロをスキップします(ストリームの塗りつぶしと幅のプロパティをチェックします)。

EDIT:2番目の考えでは、ポインタのデフォルトのoperator<<の書式を変更する良い方法はないと思います。 fillとwidth属性は、std::hexマニピュレータを使用してストリーミングアウトする場合に変更できます。

+0

したがって、オブジェクトのアドレスが0x400c10の場合、5バイトの先行ゼロは省略されます。 – cheng

+1

@ user508305ただし、すべてのポインタがプラットフォームのアドレス指定機能と同じサイズである必要はないことに注意してください。 –

+0

どのような場合にサイズが違うのですか?あなたはこれについてもっと話すことができますか、私はそれをGoogleにすることができるように私にいくつかのキーワードを与えることができますか? – cheng

1

あなたはC出力を使用し、それはより多くのあなたが後に何をしているようなものだかどうかを確認できます。

printf("0x%p"); 
関連する問題