数据模型 LP32 ILP32 LP64 ILP64 LLP64
data model
Datetype | LP64 | ILP64 | LLP64 | ILP32 | LP32 |
---|---|---|---|---|---|
char | 8 | 8 | 8 | 8 | 8 |
short | 16 | 16 | 16 | 16 | 16 |
_int32 | 32 | ||||
int | 32 | 64 | 32 | 32 | 16 |
long | 64 | 64 | 32 | 32 | 32 |
long long | 64 | 64 | 64 | 64 | 64 |
pointer | 64 | 64 | 64 | 32 | 32 |
C 语言定义了一些基本数据类型,但是没有给出数据类型实际的位宽。随着 64bit 处理器的大量使用,操作系统等软件就需要选择匹配上这些数据类型,由此产生出了上表列出的各种数据模型。
业界对 64-bit 寻址提出了三种数据模型,它们分别是 LP64, ILP64, LLP64
。至于 SIPL64
这里不列了,顾名思义,short
也是 64bit 位宽的,使用非常之少。
LP64 (also known as 4/8/8) denotes long and pointer as 64 bit types, ILP64 (also known as 8/8/8) means int, long and pointer are 64 bit types and LLP64 (also known as 4/4/8) adds a new type (long long) and pointer as 64 bit types.
Most of today’s 32 bit systems are ILP32 (that is, int, long and pointers are all 32-bits wide).
The majority of C Language programs written today for Microsoft Windows 3.1 are written for the Win-16 APIs which is an LP32 (int is 16 bits, while long and pointers are 32-bits) model. The C definitions on the Apple Macintosh are also LP32.
实际上当今 64-bit 的操作系统选择的数据模型几乎是 LP64 或者 LLP64。其中 LP64 的阵营是 类 unix 的操作系统,比如 Linux,后者则是微软的 windows。这篇文章介绍了为什么 LP64
是更优的选择1。LLP64
可以看成是 ILP32
带了 64-bit 的指针,据说微软的代码用 long
比较多,而 Unix 则是 int
居多,因此微软选择了 LLP64
,如此其数据结构中不包含指针的就能和 IPL32
保持一致2。
C 标准只规定了基本数据类型的最小长度,至于实际位宽,由选择的数据模型决定,通常是操作系统占据了主导地位,数据模型是 ABI 标准的一部分。当然 64bit 操作系统上是允许多个数据模型存在的,比如同时支持 LP64
和 ILP32
(构建32位的程序时)。
日常代码的编写常常隐含着对数据类型宽度的假设,因此,当将指针转换为整数对象时, C 代码应首选 (u)intptr_t
而不是 long。
http://www.unix.org/version2/whatsnew/lp64_wp.html ↩︎
http://nickdesaulniers.github.io/blog/2016/05/30/data-models-and-word-size/ ↩︎
数据模型 LP32 ILP32 LP64 ILP64 LLP64相关推荐
- 数据模型LP32 ILP32 LP64 LLP64 ILP64
各个C++实现所选择采用的基础类型的大小统称为"数据模型".有四种广泛采用的数据模型: 32 位系统: LP32 或 2/4/4(int 为 16-bit,long 和指针为 32 ...
- 数据模型(LP32 ILP32 LP64 LLP64 ILP64 )
数据模型(LP32 ILP32 LP64 LLP64 ILP64 ) 32位环境涉及"ILP32"数据模型,是因为C数据类型为32位的int.long.指针.而64位环境使用不同的 ...
- LP32,ILP32,LP64,LLP64,ILP64数据模型
LP32,ILP32,LP64,LLP64,ILP64数据模型 在32位和64位平台上,float都是 4 字节,double都是 8 字节:(C中直接写小数,默认是double型) LP64.LLP ...
- Datatype LP64 ILP64 LLP64 ILP32 LP32
现今所有64位的类Unix平台均使用LP64数据模型,而64位Windows使用LLP64数据模型. 所以,在 Linux 中做 Windows 的交叉编译时,需要注意 long 是 32 位.
- ILP32和LP64数据模型
32位环境涉及"ILP32"数据模型,是因为C数据类型为32位的int.long.指针.而64位环境使用不同的数据模型,此时的long和指针已为64位,故称作"LP64& ...
- [转]关于int整形变量占有字节问题
int的长度由处理器(16位,32位,64位)和比哪一期决定. 首先从处理器来讲 :16位处理器中的int 占有16位 即2个字节 32位处理器中int占有32位 即4个字节 64位处理器中int占有 ...
- 整型数据究竟占多少字节
int 和 long 在不同系统下所占字节大小 win32 win64 linux32 linux64 int (Byte) 4 4 4 4 long (Byte) 4 4 4 8 归根到底是跟机器平 ...
- c oracle 32位64位,64位与32位编程的数据类型区别(C/C++)
二.C++ 1.字节和字长 字节,八位就是一个字节,是固定概念.字长是指计算机一次能处理的二进制数据的长度,是一个非固定的概念.例如,8位计算机的字长为8,即一个字节, 32位计算机的字长位32,即4 ...
- 32位和64位系统对于程序员的影响
win32,win64编程永恒;语言编程需要注意的64位和32机器的区别 一.数据类型特别是int相关的类型在不同位数机器的平台下长度不同.C99标准并不规定具体数据类型的长度大小,只规定级别.作下比 ...
最新文章
- 深层神经网络中的前向传播
- WebApi网关之Bumblebee和Ocelot性能对比
- PROTEUS元件库元件称呼 .
- java实体类中有枚举类型_实体类的枚举属性--原来支持枚举类型这么简单,没有EF5.0也可以...
- 蓝桥杯 ADV-120算法提高 6-17复数四则运算
- Qt实战笔记-从零开始搭建一套库存管理系统-(一)准备工作
- Creator H5全平台游戏开发教程 PDF 下载(800+页)
- 中国工程院院士张尧学:透明计算/云计算操作系统
- scp远程传输文件之权限被拒绝解决方案
- 飞龙在天-中国新战机将在歼11基础上腾飞
- 我读猫扑的《大王直言拷问网络写手良心》
- 给IOS初学者及新手的建议
- MD 的图片格式排版偏差的问题
- SpringBoot无法引入@RunWith注解解决方法
- 大数据挖掘课程案例资源介绍
- 计算机主板别称是什么城,武汉别名江城又称什么城 武汉被誉为什么城之称
- 什么决定了你的职场天花板?
- 1.30.Flink SQL案例将Kafka数据写入hive
- 《嵌入式 - Lwip开发指南》第5章 LWIP测速
- [论文阅读] (ASONAM2019) Meta-GNN: 属性异构网络中用于半监督学习的元图神经网络