判断操作系统是16位还是32位的

这个问题有点模糊,因为用sizeof来判断等都是来测试的编译器的类型。

不使用sizeof的方法:

16位的系统下,
int i = 65536;
cout << i; // 输出0;
int i = 65535;
cout << i; // 输出-1;

32位的系统下,
int i = 65536;
cout << i; // 输出65536;
int i = 65535;
cout << i; // 输出65535;


#include <stdio.h>

void main(int argc,char** argv)
{
    int a[2];
    int byte = (char*)&a[1] - (char*)&a[0];

    printf("%d\n",byte);

}

#define OS_BITS (((int)((ptrdiff_t  *)0 + 1)) << 3)
调试发现:

  int *p=NULL; //0x00000000

  int *ptr = p + 1; //0x00000004

  int res = (int)ptr; // 4

  int myres = res <<3; //32

关键就是 p+1 后,移动了4个字节。

也就是说指针加法判断了系统位数。


因为想(int *)或者sizeof(int)都是由编译器处理的东西,它们的长度由编译器确定,并不受目标系统的影响。
应该使用系统通用的API来确定,比如GetVersion取的OSVERSIONINFO里dwPlatformId是1代表是Win9x/ME(16/32位混合),2代表WinNT。
或者更通用的方法是用汇编,读取CR0,如果是PE=1就是保护模式。
或者更直接的方法是直接用预编译开关来控制代码,比如#if defined WIN32什么的。

1 调用GetSystemInfo
会返给你一个SYSTEM_INFO结构

结构里
wProcessorArchitecture代表cpu架构,0是x86,9是x64  


2 Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE").IndexOf("64") != -1

如果为true则是64位的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值