C语言 怎么区分当前系统是32位还是64位?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 怎么区分当前系统是32位还是64位?相关的知识,希望对你有一定的参考价值。

我在程序中用 #ifdef WIN32 不能区分系统是32位还是64位?请问C语言怎么可以区分呢。
问题解决了,给出解决办法
  BOOL Is64bitSystem()
  
  SYSTEM_INFO si;
  GetNativeSystemInfo(&si);
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
  si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )
  return TRUE;
  else
  return FALSE;
  

顺便说明一下为什么sizeof 和 #ifdef WIN32都会失败的原因,因为这两种方法都是在编译的时候值就已经确定。

32位和64位指的是操作系统的位数,映射到C语言中,最直观的就是指针类型占用的字节数。

1 32位系统:

地址占32位,所以指针类型同样占32位,即4字节。

2 64位系统:

地址占64位,所以指针类型同样占64位,即8字节。


于是,只需要判断任意一个指针的sizeof值,即可获取到位数。

int main()

    int bits= sizeof(char *);
    if(bits == 4) printf("32位\\n");
    else if(bits == 8) printf("64位\\n");
    else printf("others, bits = %d\\n", bits);
参考技术A 有一个简单的方法来确定所编译的程序的位数,判断指针变量的长度。

int *pi;
if(sizeof(pi)==4) printf("32 bits");
if(sizeof(pi)==8) printf("64 bits");追问

我的程序是在32位系统下面编译的,然后拿到64位系统下执行。

#ifdef WIN32
sizeof 判断 都失败了

#define _B_WIN_32_ ((sizeof(int) == 4) ? TRUE : FALSE)

请问还有没有别的方法

追答

你的意思是判断程序所运行的操作系统的位数吧,我想可以调用windows相关API判断。
我提供的只是判断本程序的位数。你的sizeof(int)也一样。
要分清是程序的位数 or 操作系统的位数。windows64位可以运行32位的程序。

本回答被提问者采纳
参考技术B 简单说,C语言本身是做不到这个工作的,只能人工判定,根据机器和编译器的位数定义宏
#ifdef WIN32

#else

#endif追问

我开始也是这么做的,但是我的程序是32位下面编译的,拿到64位系统下运行,这个#ifdef WIN32一样成功,意思就是不能区分是64位 还是32位。

上面仁兄说的 sizeof我也试过 一样不行。

追答

32位下编译出来的代码在64位上是不能用的,你加了宏定义也没用,因为宏定义是在编译时进行确定的,不是在运行时确定的。所以,只能重新在64位机上进行重新编译才有可能能运行(要看你的代码可移植度够不够高!)

参考技术C 经过对include的翻查,最后确定gcc以__i386__来进行32位编码,而以__x86_64__来进行64位编码;64位的gentoo下stdio.h就是个简单例子(i不晓得其它的是不是?);而且在bits/wordsize.h中对这两个定义进行了综合,以__WORDSIZE的值来表示机器类型,大家可以直接去看看

例子

#include <stdio.h>

int main(int argc ,char* argv)



#ifdef __x86_64__

printf("__x86_64__");

#elif __i386__

printf("__i386__");

#endif

return 0;

以上是关于C语言 怎么区分当前系统是32位还是64位?的主要内容,如果未能解决你的问题,请参考以下文章

c语言int类型占的字节数因不因机子是64位还是32位的而改变啊?

C语言在64位系统上怎样编辑运行?

64位系统下C语言中int值的取值范围

我的C/C++语言学习进阶之旅 通过C++跨平台的预编译宏来区分不同的操作系统:Win32/Win64/Unix/Linux/MacOS/iOS/Android等

我的C/C++语言学习进阶之旅 通过C++跨平台的预编译宏来区分不同的操作系统:Win32/Win64/Unix/Linux/MacOS/iOS/Android等

C语言有效位