起因

在阅读《深入理解计算机系统》一书时,发现书中介绍C语言中的long类型,在64位机器下,占用8个字节的长度。

疑问

便想着写程序验证一下,于是用visual studio编写程序验证,编译为32位程序,结果如下:

一切正式,于是又将程序改为64位,运行结果如下:

结果还是4个字节,这时就有疑惑了,难道是书上讲错了吗?《深入理解计算机系统》可是非常经典的计算机书籍,按理说不会出现这种低级的错误。会不会因为是写的C++程序导致的呢?于是又改为纯C的代码,使用gcc编译。
使用gcc 编译32位程序(gcc -m32 Test.c),结果如下:

一切正常,接着编译为64位程序(gcc -m64 Test.c),结果如下:

查证

此时发现经过到目前为止的验证,书上讲的和我们实际测试的结果,并不相符,本着刨根问底的态度,于是开始上网查询资料。经过收集,我们得知,

由于数据模型不一致,现今所有64位的类Unix平台均使用LP64数据模型,而64位Windows使用LLP64数据模型,除了指针是64位,其他基本类型都没有变。每个应用程序和每个操作系统都有一个抽象数据模型。许多应用程序不会显式公开此数据模型,但该模型指导编写应用程序代码的方式。

各个C++实现所选择采用的基础类型的大小统称为“数据模型”。有四种广泛采用的数据模型:

32 位系统:

LP32 或 2/4/4(int 为 16-bit,long 和指针为 32 位): Win16 API

ILP32 或 4/4/4(int,long 和指针都为 32 位) : Win32 API 、Unix 和 Unix 类的系统(Linux,Mac OS X)

64 位系统:

LLP64 或 4/4/8(int 和 long 为 32 位,指针为 64 位):Win64 API

LP64 或 4/8/8(int 为 32 位,long 和指针为 64 位): Unix 和 Unix 类的系统(Linux,Mac OS X)

到目前为止,大概有个结论,并不是书上存在错误,而是不同平台选用的数据模型不一致,导致出现这个问题。

参考资料

https://docs.microsoft.com/zh-cn/windows/win32/winprog64/abstract-data-models?redirectedfrom=MSDN
https://stackoverflow.com/questions/9953502/how-to-make-ms-visual-c-use-lp64-instead-of-llp64
http://archive.opengroup.org/public/tech/aspen/lp64_wp.htm

关于C语言中,long类型的长度相关推荐

  1. c语言类型名占字节,在C语言中,不同类型数据所占字节数

    <在C语言中,不同类型数据所占字节数>由会员分享,可在线阅读,更多相关<在C语言中,不同类型数据所占字节数(2页珍藏版)>请在人人文库网上搜索. 1.在C语言中,double. ...

  2. java成员变量默认是_在Java语言中,String类型的成员变量的默认初始值是( )

    在Java语言中,String类型的成员变量的默认初始值是( ) 答:C.null 学生最主要的权利是() 答:受教育权 提倡教育要适合孩子的 "敏感期"的教育家是 答:蒙台梭利 ...

  3. Go 语言中 switch 类型断言用法

    Author mogd 2022-05-09 Update mogd 2022-05-09 Adage Don't live in the past. 目录 Go 语言中 switch 类型断言的用法 ...

  4. 在c语言中,字符串topt65的长度是,c语言程序设计期末考试试题(含答案)123612210...

    <c语言程序设计期末考试试题(含答案)123612210>由会员分享,可在线阅读,更多相关<c语言程序设计期末考试试题(含答案)123612210(10页珍藏版)>请在人人文库 ...

  5. linux strcpy 用法,由Linux中管道的buffer,浅谈C语言中char类型字符串拷贝使用strcpy()和=赋值符号的区别...

    今天在写父子进程用两个单向管道通信时,出现了错误: Segmentation fault (core dumped) 打开core文件发现: 附上源码: 1 #include 2 #include 3 ...

  6. Java 语言中 Enum 类型的使用介绍

    Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常 ...

  7. 在c语言中,字符串topt65的长度是,谭浩强c__程序设计第13章.ppt

    谭浩强c__程序设计第13章 第13章 输入输出流 13.1 C++的输入和输出 13.2 标准输出流 13.3 标准输入流 13.4 文件操作与文件流 13.5 字符串流 13.1 C++的输入和输 ...

  8. C语言程序设计double,C语言中double类型数据占字节数为

    1以下选项中,能用作数据常量的是________. A.o115 B.0118 C.115L D.1.5e1.5 2下列叙述中错误的是_______. A.一个C语言程序只能实现一种算法 B.一个C函 ...

  9. Java中的enum详细解析------Java 语言中 Enum 类型的使用介绍

    Enum 类型的介绍 枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中.而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常 ...

  10. c语言中管道符作用,由Linux中管道的buffer,浅谈C语言中char类型字符串拷贝使用strcpy()和=赋值符号的区别...

    今天在写父子进程用两个单向管道通信时,出现了错误: Segmentation fault (core dumped) 打开core文件发现: 附上源码: 1 #include 2 #include 3 ...

最新文章

  1. MongoDB的下载与安装
  2. js 为false的几种情况
  3. 自动化测试和手工测试
  4. Oracle之ROW_NUMBER() OVER函数
  5. 5G 时代连接 70 亿人,安全如何保障?
  6. [Codeforces235D]Graph Game——概率与期望+基环树+容斥
  7. Xshell 、PuTTY 复制文件到Linux
  8. win7计算器左移、右移操作
  9. 泛微OA云桥 未授权任意文件读取
  10. 占内存最小的浏览器:360安全浏览器超速版推荐
  11. 为什么边缘概率密度是联合概率密度的积分_看懂蒙特卡洛积分(一) 概率分布变换与随机采样...
  12. 鼠标手势插件--smartUp
  13. 爬取百度地图,获取城市楼盘信息
  14. git重新设置用户名密码
  15. 【RGBCW五路调光投光灯照明方案】 共阳极无频闪调光驱动IC 内置MOS降压恒流LED驱动芯片FP7122
  16. SEBASTIEN KWOK 2022春夏系列发布
  17. 如何进阶Java之道?首先得知道层层递进的四种软件架构
  18. 如何搭建团队知识管理体系?从入门到精通,你只差……
  19. iOS 10权限设置
  20. c-英语作文(牛客新生赛)

热门文章

  1. 关于sql server中isnull(值,值)是什么意思
  2. 项目研发阶段性总结模板
  3. ubuntu vscode c++生成so及调用调试so包
  4. Carla自动驾驶强化学习
  5. iphone科学计算器使用
  6. Python数据类型之三(列表)
  7. 在线banner制作网站
  8. 带“小弟”其实是一种投资
  9. cdr转换成html格式,cdr生成对象
  10. C语言BMP图像的读取、存入、水平镜像、竖直镜像、马赛克模糊处理、灰度二值化处理