共用方式為


新的資料類型

新的資料類型有三種類別:固定精確度整數類型、指標精確度整數類型,以及特定精確度指標類型。 這些類型已特別新增至 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.