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 个字节?
是否有可能 sizeof(pointer) < 4
在32位机器上。(1个字是32位架构)
最佳答案
问题是x位机器的定义一开始就有点模糊。我所知道的最常见的定义是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和far指针: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™。这取决于您想要/需要这些信息的原因。
关于sizeof(pointer)可以用来查找机器类型吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27528277/