sizeof(pointer)可以用来查找机器类型吗

标签 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 个字节?

是否有可能 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 代码。这使事情变得更加复杂。还有一个奇怪的老东西,叫做nearfar指针: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/

相关文章:

c - 为什么主函数中存在段错误,而外部函数中却没有?

c - "How much memory space does an array takes if the maximum size that is declared is not used?"

C:字符串到毫秒时间戳

c - 为什么gcc输出机器码有nop指令

c - 如何在 C 中的 8 皇后程序的二维数组上放置一个字符

c - 在 C 中使用指针转置矩阵

c - 如何在 Linux 中使用麦克风获取原始格式的语音

c - 在 c 中编写 Alternate_Case 函数?

C - 获取文件大小的最快方法是什么?

c - 为什么 C 中的这个队列实现会出现段错误?