64位与32位编程的数据类型

C/C++仅仅定义了这些基本数据类型之间的关系,并没有定义严格定义它们的字 长。在不同的平台上,根据编译器不同的实现,它们的字长如下表所示:

 

数据类型LP64ILP64LLP64ILP32LP32
char88888
short16 16161616
_int32N/A32N/AN/AN/A
int3264323216
long6464323232
long longN/AN/A64N/AN/A
pointer6464643232

在这张表中,LP64,ILP64,LLP64是64位平台 上的字长模型,ILP32和LP32是32位平台上的字长模型。

LP64意思是long和pointer是64 位,ILP64指int,long,pointer是64位,LLP指long long和pointer是32-bit的。ILP32指int,long和pointer是32位的,LP32指long和pointer是32位的。

 

32位Windows采用的是LP32数据模型,64位Windows采用的是LLP64数据模型。
所以,Windows上的32位程序设计和64位程序设计最大的不同(也就是IP32和LLP64的不同),就在于指针的长度不同??由32位 变成了64位。
Win32 API在很多情况下,都需要将整数转换成指针或者相反。在 32 位的硬件上不会有问题,其中指针的大小和整数的大小是相同的,但在 64 位的硬件上却完全不一样。
为此M$搞了个所谓的“多态类型”:

对于特定的精度,您可以使用固定精度的数据类型。不管处理器的词大小如何,它们的大小都是一致的。大 多数这些类型都在它们的名称中包含精度,可以从下面的表中看出:

表 1. 固定精度的数据类型
类型定义
DWORD32 32 位无符号整数
DWORD6464 位无符号整数
INT3232 位有符号整数
INT6464 位有符号整数
LONG3232 位有符号整数
LONG6464 位有符号整数
UINT32无符号 INT32
UINT64无符号 INT64
ULONG32无符号 LONG32
ULONG64无符号 LONG64

此外,当您需要数据类型的精度随着处理器词大小变化时,请使用指针精度数据类型。这些类型又称为“多 态”数据类型。这些类型通常以 _PTR 后缀结尾,如下面的表格所示:

表 2. 指针精度的数据类型
类型定义
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
LPARAM与 LONG_PTR 为同义词,(在WTypes.h 中定义)
WPARAM与 UINT_PTR 为同义词,(在 WTypes.h 中定义)

通过整数参数传递参数或上下文信息的所有 Win32 API 都更改为使用这些新的类型。

此外,还出现了定长指针:POINTER_32和POINTER_64:
#define POINTER_32 __ptr32
#define POINTER_64 __ptr64
PS:M$DN中说是在Basetsd.h中定义的,但实际上是在WinNT.h中定义的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值