如果指针的地址是64位,为什么它在打印时显示为6个字节?

时间:2012-07-17 03:33:30

标签: c pointers

#include <stdio.h>
int main(void){
  int *ptr;
  printf("the value of ptr is %p",ptr);
}

这给了我0x7fffbd8ce900,它只有6个字节。它应该是8个字节(64位)吗?

3 个答案:

答案 0 :(得分:13)

虽然指针是64位current processors actually only support 48 bits,但地址的高两个字节总是0000或(由于符号扩展)FFFF。

将来,如果48位不再足够,新处理器可以添加对56位或64位虚拟地址的支持,并且现有程序将能够利用额外空间,因为它们已经使用了64位位指针。

答案 1 :(得分:6)

这只意味着前两个字节为零(顺便提一下,目前保证x86-64芯片 - 但在这种情况下这并不意味着什么,因为你的指针没有被初始化)。允许%p截断前导零,就像任何其他数字类型一样。但是,%016p不是。这应该可以正常工作:

printf("the value of ptr is %016p", ptr);

答案 2 :(得分:-5)

因为6字节地址只是虚拟地址(实际物理地址的偏移量)。在物理体系结构(例如X86)中,存储器被分成可以由单个索引寄存器寻址而不改变16位段选择器的部分。在X86-CPU的实模式中,一个段总是使用16位(2字节)段选择器,它将在程序开始运行时由操作系统动态决定(即创建实际运行过程) )。

因此,如果您的变量具有48位地址0x7fffbd8ce900,并且您的程序具有段选择器偏移量08af,并且该变量的实际地址是(0x08af <&lt; 48)+ 0x7fffbd8ce900 = 0x08af7fffbd8ce900,即64位。

进一步阅读请转到: x86 memory segmentation