新的資料類型
新的資料類型有三種類別:固定精確度整數類型、指標精確度整數類型,以及特定精確度指標類型。 這些類型已特別新增至 Windows 環境 (Basetsd.h) ,讓開發人員在引進之前先準備 64 位 Windows。 這些新類型衍生自基本的 C 語言整數和長型別,因此它們適用于現有的程式碼。 因此,現在在您的程式碼中使用這些資料類型,在 32 位 Windows 上測試您的程式碼,並使用 64 位編譯器事先尋找並修正可攜性問題,因此當 64 位 Windows 可供測試時,您的驅動程式就可以準備就緒。
此外,採用這些新的資料類型會讓您的程式碼更強固。 若要使用這些資料類型,您必須掃描程式碼中是否有可能不安全的指標使用方式、多型和資料定義。 若要安全,請使用新的類型。 例如,當變數的類型 為 ULONG_PTR時,很明顯地,它會用於轉換算數運算或多型的指標。 您無法直接使用原生 Win32 資料類型來指出這類使用方式。 您可以使用衍生類型命名或匈牙利文標記法來執行此動作,但兩種技術都很容易發生錯誤。
Fixed-Precision整數類型
固定精確度資料類型的長度與 32 位和 64 位程式設計相同。 為了協助您記住這一點,其精確度是資料類型名稱的一部分。 以下是固定有效位數資料類型。
類型 | 定義 |
---|---|
DWORD32 |
32 位元不帶正負號的整數 |
DWORD64 |
64 位元不帶正負號的整數 |
INT32 |
32 位元帶正負號的整數 |
INT64 |
64 位元帶正負號的整數 |
LONG32 |
32 位元帶正負號的整數 |
LONG64 |
64 位元帶正負號的整數 |
UINT32 |
Unsigned INT32 |
UINT64 |
Unsigned INT64 |
ULONG32 |
Unsigned LONG32 |
ULONG64 |
未簽署 的 LONG64 |
Pointer-Precision整數類型
當指標精確度 (變更時,當針對 32 位平臺編譯時會變成 32 位,針對 64 位平臺編譯時為 64 位) ,這些資料類型會據以反映精確度。 因此,在執行指標算術時,將指標轉換成其中一種類型是安全的;如果指標有效位數為 64 位,則類型為 64 位。 計數類型也會反映指標可以參考的大小上限。 以下是指標精確度和計數類型。
類型 | 定義 |
---|---|
DWORD_PTR |
指標精確度的不帶正負號長類型。 |
HALF_PTR |
32 位系統上的半指標精確度 (16 位的帶正負號整數類型,64 位系統上 32 位) 。 |
INT_PTR |
指標精確度的帶正負號整數類型。 |
LONG_PTR |
指標精確度的帶正負號長類型。 |
SIZE_T |
指標可以參考的最大位元組數目。 針對必須跨越指標完整範圍的計數,請使用此類型。 |
SSIZE_T |
已簽署 SIZE_T。 |
UHALF_PTR |
不帶正 負號HALF_PTR。 |
UINT_PTR |
不帶正 負號INT_PTR。 |
ULONG_PTR |
不帶正 負號的LONG_PTR。 |
Fixed-Precision指標類型
另外還有明確調整指標大小的新指標類型。 在 64 位程式碼中使用這些指標類型時請小心:如果您使用 32 位類型宣告指標,系統會藉由截斷 64 位指標來建立指標。
類型 | 定義 |
---|---|
POINTER_32 |
32 位指標。 在 32 位系統上,這是原生指標。 在 64 位系統上,這是截斷的 64 位指標。 |
POINTER_64 |
64 位指標。 在 64 位系統上,這是原生指標。 在 32 位系統上,這是帶正負號的 32 位指標。 請注意,假設高指標位的狀態並不安全。 |
輔助函式
下列內嵌函式 (在 Basetsd.h) 中定義,可協助您安全地將值從某個類型轉換成另一種類型:
unsigned long HandleToUlong( const void *h )
long HandleToLong( const void *h )
void * LongToHandle( const long h )
unsigned long PtrToUlong( const void *p )
unsigned int PtrToUint( const void *p )
unsigned short PtrToUshort( const void *p )
long PtrToLong( const void *p )
int PtrToInt( const void *p )
short PtrToShort( const void *p )
void * IntToPtr( const int i )
void * UIntToPtr( const unsigned int ui )
void * LongToPtr( const long l )
void * ULongToPtr( const unsigned long ul )
警告IntToPtr sign-extends the int value, UIntToPtr zero-extend the unsigned int value, LongToPtr sign-extend the long value, and ULongToPtr zero-extends the unsigned long value.