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 是更优的选择1LLP64 可以看成是 ILP32 带了 64-bit 的指针,据说微软的代码用 long 比较多,而 Unix 则是 int 居多,因此微软选择了 LLP64,如此其数据结构中不包含指针的就能和 IPL32 保持一致2

C 标准只规定了基本数据类型的最小长度,至于实际位宽,由选择的数据模型决定,通常是操作系统占据了主导地位,数据模型是 ABI 标准的一部分。当然 64bit 操作系统上是允许多个数据模型存在的,比如同时支持 LP64ILP32(构建32位的程序时)。

日常代码的编写常常隐含着对数据类型宽度的假设,因此,当将指针转换为整数对象时, C 代码应首选 (u)intptr_t 而不是 long。


  1. http://www.unix.org/version2/whatsnew/lp64_wp.html ↩︎

  2. http://nickdesaulniers.github.io/blog/2016/05/30/data-models-and-word-size/ ↩︎

数据模型 LP32 ILP32 LP64 ILP64 LLP64相关推荐

  1. 数据模型LP32 ILP32 LP64 LLP64 ILP64

    各个C++实现所选择采用的基础类型的大小统称为"数据模型".有四种广泛采用的数据模型: 32 位系统: LP32 或 2/4/4(int 为 16-bit,long 和指针为 32 ...

  2. 数据模型(LP32 ILP32 LP64 LLP64 ILP64 )

    数据模型(LP32 ILP32 LP64 LLP64 ILP64 ) 32位环境涉及"ILP32"数据模型,是因为C数据类型为32位的int.long.指针.而64位环境使用不同的 ...

  3. LP32,ILP32,LP64,LLP64,ILP64数据模型

    LP32,ILP32,LP64,LLP64,ILP64数据模型 在32位和64位平台上,float都是 4 字节,double都是 8 字节:(C中直接写小数,默认是double型) LP64.LLP ...

  4. Datatype LP64 ILP64 LLP64 ILP32 LP32

    现今所有64位的类Unix平台均使用LP64数据模型,而64位Windows使用LLP64数据模型. 所以,在 Linux 中做 Windows 的交叉编译时,需要注意 long 是 32 位.

  5. ILP32和LP64数据模型

    32位环境涉及"ILP32"数据模型,是因为C数据类型为32位的int.long.指针.而64位环境使用不同的数据模型,此时的long和指针已为64位,故称作"LP64& ...

  6. [转]关于int整形变量占有字节问题

    int的长度由处理器(16位,32位,64位)和比哪一期决定. 首先从处理器来讲 :16位处理器中的int 占有16位 即2个字节 32位处理器中int占有32位 即4个字节 64位处理器中int占有 ...

  7. 整型数据究竟占多少字节

    int 和 long 在不同系统下所占字节大小 win32 win64 linux32 linux64 int (Byte) 4 4 4 4 long (Byte) 4 4 4 8 归根到底是跟机器平 ...

  8. c oracle 32位64位,64位与32位编程的数据类型区别(C/C++)

    二.C++ 1.字节和字长 字节,八位就是一个字节,是固定概念.字长是指计算机一次能处理的二进制数据的长度,是一个非固定的概念.例如,8位计算机的字长为8,即一个字节, 32位计算机的字长位32,即4 ...

  9. 32位和64位系统对于程序员的影响

    win32,win64编程永恒;语言编程需要注意的64位和32机器的区别 一.数据类型特别是int相关的类型在不同位数机器的平台下长度不同.C99标准并不规定具体数据类型的长度大小,只规定级别.作下比 ...

最新文章

  1. 深层神经网络中的前向传播
  2. WebApi网关之Bumblebee和Ocelot性能对比
  3. PROTEUS元件库元件称呼 .
  4. java实体类中有枚举类型_实体类的枚举属性--原来支持枚举类型这么简单,没有EF5.0也可以...
  5. 蓝桥杯 ADV-120算法提高 6-17复数四则运算
  6. Qt实战笔记-从零开始搭建一套库存管理系统-(一)准备工作
  7. Creator H5全平台游戏开发教程 PDF 下载(800+页)
  8. 中国工程院院士张尧学:透明计算/云计算操作系统
  9. scp远程传输文件之权限被拒绝解决方案
  10. 飞龙在天-中国新战机将在歼11基础上腾飞
  11. 我读猫扑的《大王直言拷问网络写手良心》
  12. 给IOS初学者及新手的建议
  13. MD 的图片格式排版偏差的问题
  14. SpringBoot无法引入@RunWith注解解决方法
  15. 大数据挖掘课程案例资源介绍
  16. 计算机主板别称是什么城,武汉别名江城又称什么城 武汉被誉为什么城之称
  17. 什么决定了你的职场天花板?
  18. 1.30.Flink SQL案例将Kafka数据写入hive
  19. 《嵌入式 - Lwip开发指南》第5章 LWIP测速
  20. [论文阅读] (ASONAM2019) Meta-GNN: 属性异构网络中用于半监督学习的元图神经网络

热门文章

  1. oracle设置字符集为gbk,rac 环境下修改oracle数据库字符集为GBK
  2. 火狐浏览器更新版本之后总是在当前页面打开新链接覆盖掉原先内容
  3. python如何调用自己写的matlab函数和mat数据
  4. WAS下Sanp、heapdump、javacore
  5. osgEarth目标选择
  6. ggplot2——图例篇
  7. SQL之cast()函数用法
  8. linux 对函数的未定义的引用,对libncurses中函数的未定义引用
  9. linux下c语言调用mysql,Linux下C语言操作MYSQL总结
  10. (自)协方差矩阵与互协方差矩阵简介