C sizeof(指针)能否用于查找机器类型

C sizeof(指针)能否用于查找机器类型,c,C,这是否在任何平台上得到确认? 我的意思是,我们可以依靠上面的检查来确定它是哪种机器类型吗 由于指针基本上用于存储32位机器中的内存位置,所以它应该是4字节,而64位机器应该是8字节 32位机器上的sizeof(指针)

这是否在任何平台上得到确认? 我的意思是,我们可以依靠上面的检查来确定它是哪种机器类型吗

由于指针基本上用于存储32位机器中的内存位置,所以它应该是4字节,而64位机器应该是8字节


32位机器上的
sizeof(指针)<4
(1字是32位体系结构)是否存在这种可能性?

这当然会给出指针的大小,以及在当前CPU模式下可以寻址的理论最大内存

然而,并非指针中的所有位实际上都可用于寻址:当前64位CPU仅使用64位指针的48位。同样,有些CPU只使用24位进行寻址,而将指针存储在32位寄存器中


此外,当前的CPU模式可能无法反映硬件的功能:64位CPU具有32位软件的兼容模式。这种软件永远无法检测到64位指针。

问题是,x位机器的定义一开始就有点模糊。我所知道的最常见的定义是x是该机器的通用寄存器的位数

以8086为例:它被广泛认为是16位机器,因为它的寄存器是16位宽的。然而,指针是由两个寄存器组合而成的,这两个寄存器产生一个20位的地址(因为20/8==2.5,我猜编译器将取整到3或4个字节;这取决于编译器)

。所以有可能
sizeof(char*)!=例如,sizeof(myFunction)

此外,有些机器支持不同的模式,如x86-64机器支持执行x86-32代码。这使事情进一步复杂化。还有一个奇怪的老东西叫做近距离指针和远距离指针:。如果它被定义为远的话

最后但并非最不重要的是字符大小。它被定义为1。但是一个字符由多少位组成是另一回事:
char\u BIT
宏告诉你,它通常是8,但在今天的一些DSP和以前的一些CPU上,它可能是7、9、16甚至更多的值。如果
CHAR\u BIT
是16位,指针是32位宽,那么在这样的机器上
sizeof(void*)==2


因此,您不能依靠
sizeof(指针)
来确定机器的“CPU大小”…但在实践中,这通常已经足够好了™. 这取决于您想要/需要信息的原因。

在64位计算机上,指针的大小应该是64位的,我不确定
int
@PaulGriffiths的大小。不,这不是我想要的,我的意思是我可以依赖上述条件吗?没有其他方法来检查我的machine@Gopi当前位置链接问题的答案将进入该问题。像“32位机器”和“64位机器”这样的术语一开始就定义得很糟糕,因此“任何平台”的答案都无法走出家门。此外,寻找一种完全可移植的方法来检测一些定义不清的机器特征看起来像是一个令人怀疑的问题。在第一种情况下,最好编写在任何平台上工作的标准程序。在第二种情况下,你最好专注于你感兴趣的具体差异(比如
长的
的大小,你可以很容易地得到),而不是假设什么是“64位机器”可能的意思是。@Maroun Maroun是否有人删除了int字?^^^因此我们不能依赖上面的检查?如果目的是确定CPU类型,则不能。如果目标是确定当前的CPU模式,那么您的检查会给出一个上限,但不会给出更多。要获得关于硬件的真实信息,您必须询问内核,例如通过解析/proc/cpuinfo。cpu在一个周期内获取的位数。但我似乎不应该依赖于此。啊哈,这是一个不同的问题,但几乎同样困难:-)我恐怕没有可移植的方法来质疑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");