Windows上64位程式設計
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採用的是IP32資料模型,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:MSDN中說是在Basetsd.h中定義的,但實際上是在WinNT.h中定義的。