64位与32位编程的数据类型区别(C/C++)

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


数据类型


LP64


ILP64


LLP64


ILP32


LP32


char


8


8


8


8


8


short


16


16


16


16


16


_int32


N/A


32


N/A


N/A


N/A


int


32


64


32


32


16


long


64


64


32


32


32


long long


N/A


N/A


64


N/A


N/A


pointer


64


64


64


32


32

在这张表中,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采用的是ILP32数据模型,64位Windows采用的是LLP64数据模型。

所以,Windows上的32位程序设计和64位程序设计最大的不同(也就是IP32和LLP64的不同),就在于指针的长度不同??由32位变成了64位。

Win32 API在很多情况下,都需要将整数转换成指针或者相反。在 32 位的硬件上不会有问题,其中指针的大小和整数的大小是相同的,但在 64 位的硬件上却完全不一样。

为此M$搞了个所谓的“多态类型”:

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

表 1. 固定精度的数据类型
类型 定义

DWORD32


32 位无符号整数


DWORD64


64 位无符号整数


INT32


32 位有符号整数


INT64


64 位有符号整数


LONG32


32 位有符号整数


LONG64


64 位有符号整数


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中定义的。

http://blog.csdn.net/harbinzju/article/details/5785024

时间: 2024-10-08 00:46:11

64位与32位编程的数据类型区别(C/C++)的相关文章

VS2013下的64位与32位程序配置

VS2013下的64位与32位程序配置 在Windows 7 64bit和Visual Studio 2013下生成64位程序. 新建一个Visual Studio Win32 Console项目,命名为WinTestX64. 代码如下 #include "stdafx.h" #include <iostream> using namespace std; #define PRINT(a) cout << #a << ":" &l

Window 32位 编程总结

Lesson01 win32 Window 32位 编程 1.Windows编程基础 2.Windows的字符 3.窗口处理 4.消息处理 5.绘图 6.对话框 7.控件 Win32编程: Windows API:函数接口 一.Windows编程基础 1.Windows应用程序分类 1.1 控制台程序 DOS程序,本身没有窗口,通过WINDOWS下的DOS窗口执行. 1.2 窗口程序 拥有自己的窗口,通过窗口可以和用户进行交互 1.3 库程序 1.3.1 静态库程序 存放代码,数据的程序,其他执

16位的MD5加密和32位MD5加密的区别

16位的MD5加密和32位MD5加密的区别 MD5加密后所得到的通常是32位的编码,而在不少地方会用到16位的编码它们有什么区别呢?16位加密就是从32位MD5散列中把中间16位提取出来!其实破解16位MD5散列要比破解32位MD5散列还慢因为他多了一个步骤,就是使用32位加密后再把中间16位提取出来, 然后再进行对比而破解32位的则不需要,加密后直接对比就可以了 admin 的加密代码:16位加密:7a57a5a743894a0e32位加密:21232f297a57a5a743894a0e4a

iOS7----64位与32位 对比 数据类型

可用如sizeof(char),sizeof(char*)等得出 32位编译器 char :1个字节 char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节.同理64位编译器) short int : 2个字节 int:  4个字节 unsigned int : 4个字节 float:  4个字节 double:   8个字节 long:   4个字节 long long:  8个字节 unsigned long:  4个字节 64位编译器 char

【转】在64位机上跑32位程序注意事项

原文网址:http://blog.chinaunix.net/uid-20742320-id-4744472.html 今天在交叉编译一个应用程序时,发现porting到板子上比较麻烦(nfs还没有支持),想现在PC上调试. 于是在板子上编译好,运行,发现指定的网页打不开,以为是httpd的confi有些出入,检查了下,没有错误. 在一筹莫展之际,直接在pc上运行突然发现出现segmdefault. segmdefault又是如何出现的呢? 通过file命令查看目标文件是elf64 而reade

很抱歉,无法安装Office(64位),因为您的计算机上已经安装了这些32位Office程序

可使用下面的方法获取最新最全的Win10 KEY: 1.请加微信公众号号:jiangivana 或扫一扫下面的二维码. 2.加微信公众号以后回复[key]将获得最新最全的Win10密钥. 64位与32位版本的Office程序不兼容,因此您一次只能安装一种类型,请尝试改为安装32位版本的Office ,或卸载其他32位Office 程序,然后再次尝试此安装. 在安装Office 2016版错误提示中有明确建议我们是重新安装32位office 还是把现有的存在Office 2013存在注册表内的残余

[PCTalk]PC 对话 - 32位 vs. 64位操作系统

这是我翻译的第一篇PC Talk,主要告诉使用者如何分辨自己系统是32位还是64位,可以帮PC Talk中文化尽一份心力感觉还是不错啦. http://support.microsoft.com/kb/958406/zh-tw 本文主要告诉您如何检查您电脑的操作系统版本. 我听说Windows有分成32位与64位版本,这两者之间有什么差别呢? "bit"代表的是数据单位(data unit).32位电脑代表一次可处理2的32次方的数据单位,64位电脑则代表可处理2的64次方的数据单位.

关于32位和64位部署出现C#调用delphi动态库DLL不成功的问题

由于项目中调用了动态库,这些动态库放在C:\Windows\System32下面,但是当部署到了64位的机器上可能就有问题了,最近这个问题就纠结了半天,在本机32为系统上测试动态调用ddl成功了,部署到64位Window Server2008上面也没问题,可是为什么到了64位的WIN7系统上出了问题呢?        最后才发现原来原来是DLL的位置不对,那么DLL到底该放到那呢?        如果细心的你,你会发现在C:\Windows\目录下面有两个文件夹:System目录和System3

32位机和64位机的区别及基本数据类型占字节数

一)64位系统和32位有什么区别? 1.64bit CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存 2.64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能会提升1倍.但这是建立在64bit操作系统,64bit软件的基础上的. 什么是64位处理器? 之所以叫做“64位处理器”,是因为电脑内部都是实行2进制运算,处理器(CPU)一次处理数据的能力也是2的倍数.8位处理器.16位处理器.32位处理器和64位处理器,其计数都是2的倍数.一次处理的数据越大,该电