可以使用sizeof(指针)来查找机器类型

时间:2014-12-17 14:50:56

标签: c

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位架构)

2 个答案:

答案 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 toOpen 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位指针。