无论如何,从C编程中找出操作系统当前是以32位还是64位模式运行。我正在使用如下的简单程序
int main(void){
switch(sizeof(void*)){
case 4: printf("32\n");
break;
case 8: printf("64\n");
break;
}
}
这是正确的做法吗? 这个代码是否适用于所有场景,例如,如果硬件是64位且操作系统是32位,它会返回什么?我没有机器在diff配置中测试它。
感谢您的建议。
答案 0 :(得分:8)
一般情况下,32位可执行文件无法判断它是在64位操作系统还是32位操作系统下运行(某些操作系统可能有办法告诉我,除了我没有搜索过),一个64位可执行文件不能在32位操作系统下运行(如果你忽略了32位操作系统模拟运行64位操作系统的处理器的可能性......)
sizeof()结果主要是编译时常量,它不会返回不同的东西,具体取决于它运行的操作系统版本。
你真的想知道什么?
答案 1 :(得分:6)
严格按照以下方式回答您的问题:
#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的退出代码。
答案 2 :(得分:3)
除了编译时方法,如果您在Windows上运行:如果进程是32位进程,则对IsWow64Process
(http://msdn.microsoft.com/en-us/library/ms684139.aspx)的调用将返回true
在64位Windows下运行。
答案 3 :(得分:2)
在Windows中,您可以查看PROCESSOR_ARCHITECTURE环境变量。当程序以32位模式运行时,它将返回“x86”(因为它在32位操作系统下运行,或者因为它在64位操作系统上运行,而在WOW64下运行为32位程序)或“IA64” “或”AMD64“如果在64位操作系统上作为本机64位程序运行。
答案 4 :(得分:1)
我认为您的解决方案可能在大多数常见情况下都有效;当然,在所有标准的IA64数据模型中,指针都是64位。然而,理论上所有架构都可能不是这样。如果编译器具有C99头,则测试sizeof(uintptr_t)
可能更安全;但又假设地址宽度表示寄存器宽度;它取决于“64位”是指地址范围还是整数范围 - 它们不必相同。
由于32位和64位编译需要不同的编译器或不同的编译器开关,因此必须在构建时知道目标体系结构,并且无需在运行时确定。
大多数编译器都提供内置的体系结构宏,以便在构建时确定它。有关各种编译器,操作系统和体系结构的此类宏的完整列表,请参见:http://predef.sourceforge.net/
答案 5 :(得分:1)
回答这个问题的唯一方法是:
(1)使用一些特定于系统的功能(API调用,环境变量等)来告诉您操作系统是32位还是64位。
或
(2)使用一些编译器提供的宏来告诉你同样的事情(如果有的话)。
无法通过任何内置标准语言功能确定您拥有的操作系统类型。它们由编译器提供,完全独立于OS。