这个问题有点模糊,因为用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位的。