这个问题有点模糊,因为用sizeof来判断等都是来测试的编译器的类型。
不使用sizeof的方法:
- <span style="font-family:Arial;color:#333333;">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;</span>
- #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)((<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位的