[英]how to find if the machine is 32bit or 64bit
无论如何,C程序都可以找到操作系统当前是在32位还是64位模式下运行。 我正在使用一个简单的程序,如下所示
int main(void){
switch(sizeof(void*)){
case 4: printf("32\n");
break;
case 8: printf("64\n");
break;
}
}
这是正确的方法吗? 该代码在所有情况下都可以工作吗,例如,如果硬件为64位,操作系统为32位,它将返回什么? 我没有机器可以在差异配置中对此进行测试。
谢谢你的建议。
通常,一个32位可执行文件将无法判断它是在64位操作系统还是32位操作系统下运行(某些操作系统可能有办法告诉我,我什么都不知道,但我没有搜索过), 64位可执行文件将无法在32位OS下运行(如果您不考虑32位OS仿真运行64位OS的处理器的可能性...)
sizeof()结果主要是一个编译时间常数,根据所运行的操作系统版本,它不会返回不同的内容。
您真正想知道什么?
要严格按照给出的答案回答您的问题:
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void) {
long wordBits = sysconf(_SC_WORD_BIT);
if (wordBits == -1 && errno == EINVAL)
return EXIT_FAILURE;
else
printf("%ld\n", wordBits);
return EXIT_SUCCESS;
}
在正确配置glibc的任何情况下,此方法都可以工作,并且会将您的寄存器大小打印到stdout,否则返回退出代码1。
除编译时方法外,如果您在Windows上运行,则如果进程为32,则对IsWow64Process
( http://msdn.microsoft.com/zh-cn/library/ms684139.aspx )的调用将返回true
位在64位Windows下运行。
在Windows中,您可以查看PROCESSOR_ARCHITECTURE环境变量。 当程序以32位模式运行时(由于它在32位OS下运行,或者因为它在64位OS上但作为WOW64下的32位程序运行,它将返回“ x86”)或“ IA64”如果在64位操作系统上作为本机64位程序运行,则为“或” AMD64“。
我认为您的解决方案在大多数情况下可能是有效的; 当然,在所有标准IA64数据模型中,指针都是64位的。 但是,从理论上讲,并非所有架构都正确。 如果编译器具有C99标头,则测试sizeof(uintptr_t)
可能更安全; 再次假设地址宽度表示寄存器宽度; 它取决于您指的是“ 64位”是地址范围还是整数范围-它们不必相同。
由于32位和64位编译需要使用不同的编译器或使用不同的编译器开关,因此目标体系结构必须在构建时就已知,而不必在运行时确定。
大多数编译器提供内置的体系结构宏,以允许在构建时确定这一点。 有关各种编译器,操作系统和体系结构的此类宏的完整列表,请参见: http : //predef.sourceforge.net/
回答此问题的唯一方法是:
(1)使用某些特定于系统的功能(API调用,环境变量等)来告诉您操作系统是32位还是64位。
要么
(2)使用一些编译器提供的宏,该宏将告诉您同一件事(如果有)。
无法通过任何内置的标准语言功能来确定您所拥有的操作系统。 它们由编译器提供,并且完全独立于OS。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.