私は64ビットLinuxでC++を使用していますが、コンパイラ(g ++)も64ビットです。整数などの変数のアドレスを出力すると、64ビット整数を出力することになっていますが、実際には48ビット整数を出力します。64ビットマシン上のC++ポインタ
int i;
cout << &i << endl;
output: 0x7fff44a09a7c
他の2バイトはどこにあるのでしょうか。お待ちしております。
ありがとうございます。
私は64ビットLinuxでC++を使用していますが、コンパイラ(g ++)も64ビットです。整数などの変数のアドレスを出力すると、64ビット整数を出力することになっていますが、実際には48ビット整数を出力します。64ビットマシン上のC++ポインタ
int i;
cout << &i << endl;
output: 0x7fff44a09a7c
他の2バイトはどこにあるのでしょうか。お待ちしております。
ありがとうございます。
ほとんどのC++実装でアドレスを表示すると、先行ゼロが表示されにくくなります。 0x00000000000013fd
のようなものは本当に価値がありません。
現在のAMD64アーキテクチャでは、48bitの仮想アドレス空間が定義されているだけです(Linuxの場合はcat /proc/cpuinfo
など)
彼らはそこにいます - 彼らはどこにも行っていません - それはストリームの書式設定だけです。先行ゼロをスキップします(ストリームの塗りつぶしと幅のプロパティをチェックします)。
EDIT:2番目の考えでは、ポインタのデフォルトのoperator<<
の書式を変更する良い方法はないと思います。 fillとwidth属性は、std::hex
マニピュレータを使用してストリーミングアウトする場合に変更できます。
あなたはC出力を使用し、それはより多くのあなたが後に何をしているようなものだかどうかを確認できます。
printf("0x%p");
数は 'どのように多くのビットを持っている '1'のでしょうか? 'uint32_t x = 1;'に十分なビットがないと不平を言うでしょうか? 'sizeof(* int)'をチェックするべきです。 –