如何找到机器是32位还是64位

时间:2010-03-08 13:58:37

标签: c 32bit-64bit

无论如何,从C编程中找出操作系统当前是以32位还是64位模式运行。我正在使用如下的简单程序

int main(void){
     switch(sizeof(void*)){
        case 4: printf("32\n");
        break;
        case 8: printf("64\n");
        break;
    }
}

这是正确的做法吗? 这个代码是否适用于所有场景,例如,如果硬件是64位且操作系统是32位,它会返回什么?我没有机器在diff配置中测试它。

感谢您的建议。

6 个答案:

答案 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位进程,则对IsWow64Processhttp://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。