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位的程序。
#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/C++语言学习进阶之旅 通过C++跨平台的预编译宏来区分不同的操作系统:Win32/Win64/Unix/Linux/MacOS/iOS/Android等
我的C/C++语言学习进阶之旅 通过C++跨平台的预编译宏来区分不同的操作系统:Win32/Win64/Unix/Linux/MacOS/iOS/Android等