有没有办法通过在C中编写一些代码来确定机器是32位还是64位?
答案 0 :(得分:8)
#include <limits.h>
/* ... */
printf("This machine's pointers to void, in a program "
"compiled with the same options as this one and "
"with the same compiler, use %d bits\n",
(int)sizeof (void*) * CHAR_BIT);
答案 1 :(得分:7)
如果用“C中的某些代码”表示标准C代码,那么答案是否定的,这是不可能的。对于C程序,它可以看到的“世界”完全由实现(由编译器)创建。编译器可以完全模拟任何与底层硬件完全无关的“世界”。
例如,您可以在64位计算机上运行32位编译器,但您永远无法从程序中检测到这是64位计算机的事实。
您可以找到有关该机器的任何信息的唯一方法是访问某些非标准设施,例如某些特定于操作系统的API。但这远远超出了C语言的范围。
无需添加,基于sizeof
和其他标准语言设施的其他答案方法中已经提出的方法甚至不能近距离检测机器的位数。相反,他们会检测编译器实现提供的平台的位数,这在一般情况下是完全不同的。
答案 2 :(得分:1)
没有32位或64位环境这样的东西,这太过于过于简单了。如果要编写可移植应用程序,则可以使用整数,指针和浮点大小的几个特性。
可以使用适当的宏检查不同整数类型的大小,例如UINT_MAX
等,指针大小为UINTPTR_MAX
。由于可能存在填充位,为了推断类型的宽度,您应该打印类似(unsigned long long)(T)-1
的内容,其中T
是无符号类型。
答案 3 :(得分:0)
指针大小
sizeof (void *) * CHAR_BIT
是一个很好的指标,但在更奇特的架构上可能会产生误导(例如,如果地址总线的大小不是字大小的倍数)并且只代表执行环境(可能与实际硬件不同 - 请参阅AndreyT's answer)。
在预处理阶段,您可以在C语言框架内做的最好的事情就像
UINTPTR_MAX == UINT64_MAX
与上述相同的限制适用。
答案 4 :(得分:0)
是的,如果在x86处理器上运行,请使用CPUID指令: