新数据类型
为 64 位 Windows 引入了三类数据类型:固定精度数据类型、指针精度类型和特定指针精度类型。 这些类型已添加到开发环境,使开发人员能够准备 64 位 Windows。 这些类型派生自基本的 C 语言整数和长类型。 因此,可以在 32 位 Windows 上编译和测试的代码中使用这些数据类型,然后在面向 64 位 Windows 时使用 64 位编译器重新编译。
即使对于仅面向 32 位 Windows 的应用程序,采用这些新数据类型也会使代码更加可靠。 若要使用这些数据类型,必须扫描代码中可能存在不安全的指针用法、多态性和数据定义。 例如,当变量的类型 为 ULONG_PTR 时,很明显,它将用于转换算术运算或多态性的指针。 不能通过使用较旧的数据类型直接指示此类用法。 (可以使用派生类型命名或匈牙利符号间接执行此操作,但这两种方法都容易出错。)
所有这些数据类型都在 BaseTsd.h 中声明。 有关详细信息(包括这些数据类型的定义),请参阅 Windows 数据类型。
固定精度
固定精度数据类型在 32 位和 64 位 Windows 中的长度相同。 为了帮助你记住这一点,其精度是数据类型名称的一部分。 以下是固定精度数据类型。
术语 | 说明 |
---|---|
DWORD32 |
32 位无符号整数 |
DWORD64 |
64 位无符号整数 |
INT32 |
32 位带符号整数 |
INT64 |
64 位带符号整数 |
LONG32 |
32 位带符号整数 |
LONG64 |
64 位带符号整数 |
UINT32 |
未签名 的 INT32 |
UINT64 |
未签名 的 INT64 |
ULONG32 |
无符号 LONG32 |
ULONG64 |
无符号 LONG64 |
指针精度
当指针精度 (即,当指针精度在 32 位 Windows 上变为 32 位,在 64 位 Windows) 上变为 64 位时,指针精度数据类型相应地反映精度。 因此,在执行指针算术时,可以安全地将指针强制转换为其中一种类型;如果指针精度为 64 位,则类型为 64 位。 计数类型还反映了指针可以引用的最大大小。 以下是指针精度和计数类型。
术语 | 说明 |
---|---|
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。 |
特定Pointer-Precision类型
以下新指针类型显式调整指针的大小。 在 64 位代码中使用指针时请谨慎:如果使用 32 位类型声明指针,操作系统将通过截断 64 位指针来创建指针。 (64 位 Windows 上的所有指针均为 64 位)
术语 | 说明 |
---|---|
POINTER_32 |
32 位指针。 在 32 位 Windows 上,这是一个本机指针。 在 64 位 Windows 上,这是截断的 64 位指针。 |
POINTER_64 |
64 位指针。 在 64 位 Windows 上,这是一个本机指针。 在 32 位 Windows 上,这是一个符号扩展的 32 位指针。 请注意,假定高指针位的状态是不安全的。 |