我在64位linux下使用c ++,编译器(g ++)也是64位。当我打印某个变量的地址时,例如一个整数,它应该打印一个64位整数,但实际上它会打印一个48位整数。
int i;
cout << &i << endl;
output: 0x7fff44a09a7c
我想知道其他两个字节在哪里。期待你的帮助。
感谢。
答案 0 :(得分:8)
在大多数C ++实现中打印地址会抑制前导零以使事物更具可读性。像0x00000000000013fd
这样的东西并没有真正增加价值。
当您想知道为什么通常在用户空间中看不到超过48位的值时,这是因为当前的AMD64架构被定义为具有48位的虚拟地址空间(例如,cat /proc/cpuinfo
可以看到Linux)的
答案 1 :(得分:3)
他们在那里 - 他们没有去过任何地方 - 它只是流中的格式。它会跳过前导零(检查流的填充和宽度属性)。
编辑:再想一想,我认为没有一种很好的方法可以改变指针默认operator<<
的格式。如果使用std::hex
操纵器流出,则可以更改填充和宽度属性。
答案 2 :(得分:1)
为了好玩,你可以使用C输出,看看它是否更像你所追求的:
printf("0x%p");