if(sizeof(pointer) == 4) /* 4*8 = 32 bits */
printf("32 bit machine");
if(sizeof(pointer) == 8) /* 8*8 = 64 bits */
printf("64 bit machine");
这可以在任何平台上得到确认吗? 我的意思是我们可以依靠上面的检查来确定它是哪种机器类型?
由于指针主要用于存储32位机器中的内存位置,它应该是4字节而64位机器应该是8字节?
是否有可能是32位机器上的sizeof(pointer) < 4
。(1个字是32位架构)
答案 0 :(得分:2)
问题是 x -bit机器的定义开始时有点模糊。我所知道的最常见的定义是 x 是该机器的通用寄存器的位数。
以8086为例:它被广泛认为是16位机器,因为它的寄存器是16位宽。然而,通过组合两个寄存器形成指针,这两个寄存器产生一个20位地址(因为20/8 == 2.5我猜编译器会将其舍入到3或4个字节;这取决于编译器。)
The C standard even allows pointers to different types to be of different sizes。例如,sizeof(char*) != sizeof(myFunction)
可能就是这样。
此外,一些机器支持不同的模式,例如x86-64机器支持执行x86-32代码。这进一步使事情复杂化。然后有一个奇怪的旧东西叫做 near 和远指针:pointers in Turbo C for x86-16 thus were 2 byte or 4 byte wide, depending on what they pointed to。 Open Watcom compiler can give you 6-byte pointers on x86-32如果定义为远。
最后但并非最不重要的是字符大小。它被定义为1.但是有多少位构成一个字符是另一回事:CHAR_BIT
宏告诉你它通常是8,但是在今天的一些DSP和一些以前的CPU上它可能是像7,9,16甚至更多的值。如果CHAR_BIT
为16且指针为32位宽,则在此类计算机上为sizeof(void*) == 2
。
所以你不能依靠sizeof(pointer)
来确定机器的“CPU大小”......但实际上,这通常是Good Enough™。这取决于为什么你想要/需要的信息。
答案 1 :(得分:1)
这肯定会为您提供指针的大小,以及在当前CPU模式下可以解决的理论最大内存量。
但是,并非指针中的所有位实际上都不能用于寻址:当前64位CPU仅使用64位指针的48位。同样,有些CPU只使用24位进行寻址,同时将指针存储在32位寄存器中。
此外,当前的CPU模式可能无法反映硬件的功能:64位CPU具有32位软件的兼容模式。这样的软件永远无法检测到64位指针。