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