广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c++32位程序和64位程序的区别有哪些
  • 439
分享到

c++32位程序和64位程序的区别有哪些

2023-06-16 11:06:15 439人浏览 安东尼
摘要

这篇文章主要讲解了“c++32位程序和64位程序的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c++32位程序和64位程序的区别有哪些”吧!代码上的区别实际上,对于32位程序和6

这篇文章主要讲解了“c++32位程序和64位程序的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c++32位程序和64位程序的区别有哪些”吧!

代码上的区别

实际上,对于32位程序和64位程序来说,代码上的区别不大,严格来说,甚至是一样的,它的主要区别在于一些基本数据类型占用的字节长度不一样(注:这里仅针对类Unix平台)

类型32位占用字节64位占用字节
long48
unsigned long48
指针48

当然这里的long包括一些用它定义的类型,如time_t,它的长度也是有区别的,关于time_t,还有一个有意思的问题《什么是2038问题》。

除此之外,其默认对齐字节数,也不一样,32位程序为4字节,64位程序默认为8字节。关于字节对齐,可参考《理一理字节对齐的那些事》。

可执行文件上的区别

来看个小例子吧,看看他们有何区别。

//来源:公众号编程珠玑 //作者:守望先生 test.c #include<stdio.h> struct Test {   int a;   long b; }; int main(void) {     printf("sizeof(long) = %zu\n",sizeof(long)); //long类型占用字节数     printf("sizeof(unsigned long) = %zu\n",sizeof(unsigned long));//unsigned long类型占用字节数     struct Test test = {1,2};     printf("sizeof(struct Test) = %zu\n",sizeof(test));//用于测试对齐字节数     printf("sizeof(pointer) = %zu\n",sizeof(&test)); //指针占用字节数     return 0; }

如果你的系统是64位,默认编译为64位程序,而如果需要编译为32位程序,则需要带上-m32参数,如果你的系统是32位的,那么是不能直接运行64位程序的,但是如果是64位的,是可以运行32位程序的。(实际上你在下载软件的时候需要选择位数的时候,就需要注意了,如果你的系统32位的,  但是你下载了一个64位的程序包,自然是不可用的,但是反过来却可以。)

编译为32位程序运行:

GCc -o  test32 test.c -m32 $ ./test32 sizeof(long) = 4 sizeof(unsigned long) = 4 sizeof(struct Test) = 8 sizeof(pointer) = 4

编译位64位程序运行:

$ gcc -o test64 test.c  $ ./test64  sizeof(long) = 8 sizeof(unsigned long) = 8 sizeof(struct Test) = 16 sizeof(pointer) = 8

通过运行结果,我们也可以看出前面提到的差别。

那么可执行文件本身有什么差别呢?

$ readelf -h test32 ELF Header:   Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00    Class:                             ELF32   Data:                              2's complement, little endian   Version:                           1 (current)   OS/ABI:                            UNIX - System V   ABI Version:                       0   Type:                              EXEC (Executable file)   Machine:                           Intel 80386   (...)

可以看到Class属性标识为ELF32。

而对于64位:

readelf -h test64 ELF Header:   Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00    Class:                             ELF64   Data:                              2's complement, little endian   Version:                           1 (current)   OS/ABI:                            UNIX - System V   ABI Version:                       0   Type:                              EXEC (Executable file)   Machine:                           Advanced Micro Devices X86-64

它的属性为ELF64。实际上我们可以通过readelf发现很多信息。

例如你在进行交叉编译后出现链接错误或者最后的执行程序在目标机器无法运行,则可以查看Machine部分,看看程序是否能在你想要的平台运行。

例如64位程序中的Machine中显示的是Advanced Micro Devices X86-64,至少说明它在arm平台是没法正常运行的。

一个程序最大能申请多少内存空间?

还记得这道面试题吗?如果你只是回答linux理论最大不超过3G,windows不超过G,那肯定是不完整的,这里必须要区分32位程序和64位程序。

这一点在《解引用NULL为什么会挂死?》中已经有所提及。32位决定了其虚拟地址空间的最大值为2^32,即4G,除去操作系统占用的1G左右,剩下3G左右,当然了这里面3G包含了所有代码,数据等,总结就是,最终能使用的不超过3G。不到3G的地址空间。(注这里并不表示它只能访问计算机4G的内存,而是表示最大寻址范围为4G)。那么64位的虚拟地址空间扩展到了17179869184G,所以,看出差别了吗?

通过上面简单的分析可以发现,64位程序理论能使用的内存是惊人的,而32位程序却非常有限,除此之外,还有一个在《什么是2038问题》》中提到的问题,就是2038年后,32位程序将很难正常使用时间相关的处理。

当然了,64位系统通常能够支持更高精度的浮点运算。

同时支持32位和64位代码编写原则

基于前面提到的原因,很多传统系统都开始着手移植到64位系统上,而如果原先代码就非常规范的话,移植工作还算比较轻松,链接64位库,编译成64位程序即可,但是如果没有遵循以下原则,那么工作量就比较大了:

依赖long类型和指针类型占用空间大小以及其表示范围

当然,对于这个原则,其表现可能非常多。

long和int混用

例如:

void test(long len) {     int localLen = len;     xxxx; }

这里很明显可能会发现截断。最常见的就是:

int len = sizeof(xxx);

当然,这里大多数情况下也不会有太大问题,直到其长度大于int表示范围。

慎用掩码定义

我们可能经常需要定义一些掩码:

long mask = OxFFFFFFFFL;

在 32 位系统上,这会将所有位都置位(每位全为 1),但是在 64 位系统上,只有低 32 位被置位了。结果是这个值是  0x00000000FFFFFFFF。

如果希望所有位置1,那么可以:

long mask = 1L << ((sizeof(long) * 8) - 1);

打印指针

32下,这样的没问题的:

int a = 10; int *p = &a; printf("%x",p);

但是64位下,打印不完全。自然要使用:

printf("%p",p);

传送结构体数据

在32位和64位系统中,其默认对齐字节数是不一样的。

strcut test {     int a;     long b; }

如果对方是64位,发送过来上述结构体数据,而你的是32位程序,可想而知,结果并不会如你所愿。前面占用空间16字节,而后者占用空间8字节。

显示定义long

如果你的数据类型是long,那么可以使用L显示说明:

long i = 1 << a;

上面的写法建议换成:

long i  = 1L << a;

避免数据被截断。

感谢各位的阅读,以上就是“c++32位程序和64位程序的区别有哪些”的内容了,经过本文的学习后,相信大家对c++32位程序和64位程序的区别有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: c++32位程序和64位程序的区别有哪些

本文链接: https://www.lsjlt.com/news/283297.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c++32位程序和64位程序的区别有哪些
    这篇文章主要讲解了“c++32位程序和64位程序的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c++32位程序和64位程序的区别有哪些”吧!代码上的区别实际上,对于32位程序和6...
    99+
    2023-06-16
  • win7 32位和64位有哪些区别
    这篇文章主要介绍了win7 32位和64位有哪些区别的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇win7 32位和64位有哪些区别文章都会有所收获,下面我们一起来看看吧。win7 32位和64位区别区别一:处...
    99+
    2023-07-01
  • linux中32位和64位的区别有哪些
    本篇内容主要讲解“linux中32位和64位的区别有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux中32位和64位的区别有哪些”吧!区别:1、64位是为高性能应用程序所设计开发的,...
    99+
    2023-06-22
  • 电脑32位和64位的区别有哪些
    这篇文章主要介绍“电脑32位和64位的区别有哪些”,在日常操作中,相信很多人在电脑32位和64位的区别有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”电脑32位和64位的区别有哪些”的疑惑有所帮助!接下来...
    99+
    2023-07-02
  • python 32位和64位的区别在哪
    64位能够用更大的内存空间,64位可以在64位的系统下运行,但是不能在32位系统下运行。32位能够在32位和64位上运行,考虑到兼容性,建议使用32位的python。 ...
    99+
    2023-01-31
    区别 python
  • win732位和64位的区别有哪些
    本篇内容介绍了“win732位和64位的区别有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! win...
    99+
    2023-02-07
    win7
  • win7的32位和64位系统有什么区别
    Windows 7的32位和64位系统有以下区别:1. 内存容量:32位系统最多只能支持4GB的内存,而64位系统可以支持更多的内存...
    99+
    2023-08-23
    win7
  • 电脑操作系统中32位和64位到底有哪些区别
    电脑操作系统中32位和64位的区别主要在以下几个方面:1. 内存支持:32位操作系统最多支持4GB的内存,而64位操作系统可以支持更...
    99+
    2023-09-07
    电脑
  • 如何解决64位下无法运行32位程序的问题
    如何解决64位下无法运行32位程序的问题,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 cmd进入DOS的窗口,然后进入 cd /d %systemdrive%\Inetp...
    99+
    2023-06-14
  • xpath定位和css定位的区别有哪些
    这篇“xpath定位和css定位的区别有哪些”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“xpath定位和css定位的区别有哪些”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解...
    99+
    2023-06-06
  • vue和小程序有哪些区别
    vue和小程序的区别有以下几点生命周期不同vue的生命周期包括beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed八个阶段...
    99+
    2022-10-08
  • 小程序和html5的区别有哪些
    小编给大家分享一下小程序和html5的区别有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 区别...
    99+
    2022-10-19
  • 小程序和app的区别有哪些
    小程序和app的区别有:1.两者之间的下载、安装、占用空间方式不同;2.两者之间的开发成本不同;3.用户群体各不相同;4.两者之间的推广难度不同;5.市场前景不同等。他们的区别有以下几点:区别一:下载、安装、占用空间不同大家都知道APP都需...
    99+
    2022-10-15
  • 个人小程序和企业小程序的区别有哪些
    个人小程序和企业小程序的区别有:1.申请注册的流程不同;2.开发的性质不同;3.各自拥有的功能不同;4.服务的类型项目不同;5.商业服务类别不同。两者区别分析:注册流程不同个人版的注册主体是个人用户,操作流程简单,只需个人身份信息验证即可。...
    99+
    2022-10-23
  • 小程序和网页的区别有哪些
    小程序和网页的区别是:1.两者运行环境不同;2.开发成本不同;3.给予用户的体验感不同;4.策略定位不同等。具体区别分析区别之一:运行环境不同网页开发渲染线程和脚本线程是互斥的,这也是为什么长时间的脚本运行可能会导致页面失去响应,而在小程序...
    99+
    2022-10-05
  • win7提示不是有效的32位程序如何解决
    如果在Windows 7上运行一个32位程序时出现“不是有效的32位应用程序”的错误消息,可能是以下几个原因造成的:1. 应用程序损...
    99+
    2023-09-12
    win7
  • win7提示不是有效的32位程序如何处理
    如果在Windows 7上运行一个32位程序时收到“不是有效的32位程序”的提示,可能有以下几种原因和解决方法:1. 该程序可能已损...
    99+
    2023-09-16
    win7
  • 微信小程序和支付宝小程序的区别有哪些
    这篇文章主要介绍了微信小程序和支付宝小程序的区别有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。微信小程序微信小程序是存在于微信内的一种轻应用形态,为用户提供不需要下载即...
    99+
    2023-06-27
  • 微信小程序和支付宝小程序有哪些区别
    这篇文章主要为大家展示了“微信小程序和支付宝小程序有哪些区别”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序和支付宝小程序有哪些区别”这篇文章吧。1.生态差异 :从微信和支付宝的属性来看...
    99+
    2023-06-27
  • vue和微信小程序的区别有哪些
    这期内容当中小编将会给大家带来有关vue和微信小程序的区别有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、生命周期先贴两张图:vue生命周期小程序生命周期相比之下...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作