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

我在程序中用#ifdefWIN32不能区分系统是32位还是64位?请问C语言怎么可以区分呢。问题解决了,给出解决办法BOOLIs64bitSystem(){SYSTEM_... 我在程序中用 #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都会失败的原因,因为这两种方法都是在编译的时候值就已经确定。
展开
 我来答
风若远去何人留
2016-01-05 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450133
专业C/C++软件开发

向TA提问 私信TA
展开全部

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);
}
高楼寻缝
推荐于2017-09-17 · TA获得超过175个赞
知道小有建树答主
回答量:160
采纳率:0%
帮助的人:160万
展开全部
有一个简单的方法来确定所编译的程序的位数,判断指针变量的长度。

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位的程序。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kaixingui2012
2014-08-14 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6461万
展开全部
简单说,C语言本身是做不到这个工作的,只能人工判定,根据机器和编译器的位数定义宏
#ifdef WIN32

#else

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

上面仁兄说的 sizeof我也试过 一样不行。
追答
32位下编译出来的代码在64位上是不能用的,你加了宏定义也没用,因为宏定义是在编译时进行确定的,不是在运行时确定的。所以,只能重新在64位机上进行重新编译才有可能能运行(要看你的代码可移植度够不够高!)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yangjh158
2014-08-14 · TA获得超过8422个赞
知道大有可为答主
回答量:2079
采纳率:80%
帮助的人:944万
展开全部
经过对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;

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式