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

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

不使用sizeof的方法:

  1. <span style="font-family:Arial;color:#333333;">16位的系统下,  
  2. int i = 65536;  
  3. cout << i; // 输出0;  
  4. int i = 65535;  
  5. cout << i; // 输出-1;  
  6.   
  7. 32位的系统下,  
  8. int i = 65536;  
  9. cout << i; // 输出65536;  
  10. int i = 65535;  
  11. cout << i; // 输出65535;</span>  


  1. #include <stdio.h>  
  2.   
  3. void main(int argc,char** argv)  
  4. {  
  5.     int a[2];  
  6.     int byte = (char*)&a[1] - (char*)&a[0];  
  7.   
  8.     printf("%d\n",byte);  
  9.   
  10. }  

  1. #define OS_BITS (((int)((<span style="line-height: 18px; ">ptrdiff_t </span> *)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、付费专栏及课程。

余额充值