C/C++僅僅定義了這些基本數據類型之間的關系,並沒有定義嚴格定義它們的字長。在不同的平台上,根據編譯器不同的實現,它們的字長如下表所示:
數據類型 |
LP64 |
ILP64 |
LLP64 |
ILP32 |
LP32 |
char |
8 |
8 |
8 |
8 |
8 |
short |
16 |
16 |
16 |
16 |
16 |
_int32 |
N/A |
32 |
N/A |
N/A |
N/A |
int |
32 |
64 |
32 |
32 |
16 |
long |
64 |
64 |
32 |
32 |
32 |
long long |
N/A |
N/A |
64 |
N/A |
N/A |
pointer |
64 |
64 |
64 |
32 |
32 |
在這張表中,LP64,ILP64,LLP64是64位平台上的字長模型,ILP32和LP32是32位平台上的字長模型。
LP64意思是long和pointer是64位,ILP64指 int,long,pointer是64位,LLP指long long和pointer是32-bit的。ILP32指int,long和pointer是32位的,LP32指long和pointer是32位的。
32位Windows采用的是ILP32數據模型,64位Windows采用的是LLP64數據模型。
所以,Windows上的32位程序設計和64位程序設計最大的不同(也就是IP32和LLP64的不同),就在於指針的長度不同??由32位變成了64位。
Win32 API在很多情況下,都需要將整數轉換成指針或者相反。在 32 位的硬件上不會有問題,其中指針的大小和整數的大小是相同的,但在 64 位的硬件上卻完全不一樣。
為此M$搞了個所謂的“多態類型”:
對於特定的精度,您可以使用固定精度的數據類型。不管處理器的詞大小如何,它們的大小都是一致的。大多數這些類型都在它們的名稱中包含精度,可以從下面的表中看出:
表 1. 固定精度的數據類型 | |
類型 | 定義 |
DWORD32 |
32 位無符號整數 |
DWORD64 |
64 位無符號整數 |
INT32 |
32 位有符號整數 |
INT64 |
64 位有符號整數 |
LONG32 |
32 位有符號整數 |
LONG64 |
64 位有符號整數 |
UINT32 |
無符號 INT32 |
UINT64 |
無符號 INT64 |
ULONG32 |
無符號 LONG32 |
ULONG64 |
無符號 LONG64 |
此外,當您需要數據類型的精度隨着處理器詞大小變化時,請使用指針精度數據類型。這些類型又稱為“多態”數據類型。這些類型通常以 _PTR 后綴結尾,如下面的表格所示:
表 2. 指針精度的數據類型 | |
類型 | 定義 |
DWORD_PTR |
指針精度的無符號長類型 |
HALF_PTR |
指針大小的一半。用於包含一個指針和兩個小型字段的結構中 |
INT_PTR |
指針精度的有符號整型 |
LONG_PTR |
指針精度的有符號長類型 |
SIZE_T |
指針可以引用的最大字節數。用於必須跨指針的整個范圍的計數 |
SSIZE_T |
有符號 SIZE_T |
UHALF_PTR |
無符號 HALF_PTR |
UINT_PTR |
無符號 INT_PTR |
ULONG_PTR |
無符號 LONG_PTR |
LPARAM |
與 LONG_PTR 為同義詞,(在WTypes.h 中定義) |
WPARAM |
與 UINT_PTR 為同義詞,(在 WTypes.h 中定義) |
通過整數參數傳遞參數或上下文信息的所有 Win32 API 都更改為使用這些新的類型。
此外,還出現了定長指針:POINTER_32和POINTER_64:
#define POINTER_32 __ptr32
#define POINTER_64 __ptr64
PS:M$DN中說是在Basetsd.h中定義的,但實際上是在WinNT.h中定義的。
http://blog.csdn.net/harbinzju/article/details/5785024