繁体   English   中英

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

[英]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,则对IsWow64Processhttp://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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM