数据类型 | 编译配置 | |
X86 | X64 | |
char | 1字符 | 1字符 |
short | 2字符 | 2字符 |
int | 4字符 | 4字符 |
long | 4字符 | 4字符 |
longlong | 8字符 | 8字符 |
float | 4字符 | 4字符 |
double | 8字符 | 8字符 |
long double | 8字符 | 8字符 |
wchar_t | 2字符 | 2字符 |
bool | 1字符 | 1字符 |
char* | 4字符 | 8字符 |
bool* | 4字符 | 8字符 |
short* | 4字符 | 8字符 |
int* | 4字符 | 8字符 |
long* | 4字符 | 8字符 |
long long* | 4字符 | 8字符 |
float* | 4字符 | 8字符 |
double* | 4字符 | 8字符 |
long double* | 4字符 | 8字符 |
wchar_t* | 4字符 | 8字符 |
总结:经上述比较,一般变量在X86和X64系统下长度没什么区别,区别在于 指针的 寻址范围从32位增加到了64位。如果考虑对64位系统下程序的兼容性,指针是唯一需要注意的地方。从32位系统过渡到64位系统不同于从16位系统过渡 到32位系统,因为DOS系统下int只有2个字节,而Windows系统下int是4个字节,过渡到64位系统后int的字节数没有增加。如果使用 Windows系统编程,支持64位需要Visual Studio 2005/2008/2010/2012均可,而早期版本是不支持64位平台的。
2位,64位会有下面4种情况。(CPU现在一般都是64位的 了)
32位系统,32位编译:int --4字节 DWORD64 -- 8字节 指针 -- 4字节
32位系统,64位编译(程序不能运行)
64位系统,32位编译:int --4字节 DWORD64 -- 8字节 指针 -- 4字节
64位系统,64位编译:int --4字节 DWORD64 -- 8字节 指针 -- 8字节
1 字节 = 8 bit 32位,64位都一样。
另外补充两个概念:
地址空间沙箱:进程可用的地址空间限制在最底部的2GB中。
另一个沙箱:作业 ---针对进程。
测试代码:
- int iIntLen,iShortLen,iLongLen,iWordLen,iDWordLen,iDWord64Len;
- iIntLen = sizeof(int);
- iShortLen = sizeof(short);
- iLongLen= sizeof(long);
- iWordLen = sizeof(WORD);
- iDWordLen = sizeof(DWORD);
- iDWord64Len = sizeof(DWORD64);
- CString str;
- str.Format(_T("IntLen=%d,ShortLen=%d,LongLen=%d,WordLen=%d,DWordLen=%d,DWord64Len=%d"),iIntLen,iShortLen,iLongLen,iWordLen,iDWordLen,iDWord64Len);
- MessageBox(str);
- int iCharPLen,iIntPLen;
- char * pChar = NULL;
- int * pInt = NULL;
- iCharPLen = sizeof(pChar);
- iIntPLen = sizeof(pInt);
- str.Format(_T("pChar = %d,pInt = %d"),iCharPLen,iIntPLen);
- MessageBox(str);