新数据类型

有三类新数据类型:固定精度整数类型、指针精度整数类型和特定精度指针类型。 这些类型已具体添加到 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

未签名 的 INT32

UINT64

未签名 的 INT64

ULONG32

无符号 LONG32

ULONG64

无符号 LONG64

Pointer-Precision整数类型

当指针精度 (变化时,即,在为 32 位平台编译时变为 32 位,在为 64 位平台编译时变为 64 位) ,这些数据类型相应地反映精度。 因此,在执行指针算术时,可以安全地将指针强制转换为其中一种类型;如果指针精度为 64 位,则类型为 64 位。 计数类型还反映了指针可以引用的最大大小。 以下是指针精度和计数类型。

类型 定义

DWORD_PTR

指针精度的无符号长类型。

HALF_PTR

半指针精度的带符号整型 (32 位(在 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 位指针。

请注意,假定高指针位的状态是不安全的。

Helper 函数

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-extend the int value, UIntToPtr zero extend the unsigned int value, LongToPtr sign- extend the long value, ULongToPtr zero extend the unsigned long value.