C语言——整数和浮点数在内存中存储

目录

一.大小端字节序

二.整数在内存中的存储

三.浮点数在内存中的存储


一.大小端字节序

超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题。按照不同的标准来存储,可以分为 大端字节序存储小端字节序存储

大端字节序存储:把数据的低位字节内容存放在内存的高地址处,高位字节内容存放在低地址处。

小端字节序存储:把数据的低位字节内容存放在内存的低地址处,高位字节内容存放在高地址处。


VS2022中,编译器采用的是小端字节序存储

由于是小段字节序存储,所以0x11223344这个16进制数字在内存中是倒着存放的


二.整数在内存中的存储

整数的二进制表示形式有三种,原码、反码和补码

这三种形式都有符号位数值位。

1.数值位的最高一位是符号位;

2.符号位“0”表示正“1”表示负

正整数的原、反、补码相同。

负整数的情况则不同。

原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。

反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

补码:反码+1就得到补码。

负整数的原 补码关系如下:


对于整型数据来说,整数在内存中存放的是它的补码

这样做的好处是什么呢?

1. 加法减法也可以统⼀处理CPU只有加法器

2.补码原码相互转换,其运算过程是相同的,不需要额外的硬件电路


三.浮点数在内存中的存储

浮点数与整数存储完全不一样。

根据国际标准IEEE(电气和电子工程协会)754,任意⼀个⼆进制浮点数V可以表示成下面的形式:

例子:⼗进制的5.0转换为二进制就是 101.0 == 1.01 * 2 ^ 2

此时 S = 0     M = 1.01     E = 2


对于不同类型的浮点数,具体的存储类型也不一样。

对于32位(float)浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M

对于64位(double)浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M


浮点数存储过程:

1.有效数字M

我们知道1 <= M <2,也就是说其可以表示为1.xxxxx的形式 。

IEEE 754规定,在计算机内部保存M时,默认M的第一位是1,因此可以被舍去,只保存后⾯的 xxxxxx部分。比如保存1.05的时候,只保存05,等到读取的时候,再把第⼀位的1加上去。

这样做可以节省1位有效数字,以32位浮点数为例子,留给M只有23位,将第⼀位的1舍去以后,等于可以保存24位有效数字。

2.指数E

首先也是最重要的一点,E是无符号整数(unsignedint)

如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但我们知道科学计数法的指数是可以出现负数的。所以,放入内存的E等于其真实值加上一个中间数(8位的E,中间数为127;11位的E,中间数为1023)

为什么这样做?

以8位的E说明:

E是无符号整数范围为0~255。但是我们又需要负指数,为了让正负指数的位数量基本均等,-127~128.存储的时候加上127,这样刚好是0~255,便于存储,不必判断符号位。


浮点数读取过程:

以指数E位标准,从内存中取出浮点数有以下三种情况

1.E不全为0或不全为1

存入内存的E减去127(或者1023)得到E的真实值,将有效数字M加上第一位的1。

例子:

0.5的⼆进制形式为0.1,那就是1.0*2^(-1),其E为-1 + 127=126,表⽰为01111110,⽽尾数1.0去掉”1“为0,补⻬0到23位 00000000000000000000000,则其⼆进制表示形式为:

2.E全为0

E全为0,那真实的E按理来说应该就是-127。但是真实情况是E = 1 - 127 这是特殊情况!!!

此时,有效数字M不再加上第一位的“1”,而是还原成0.xxxxxx的小数。

这样做的原因:真实的E为-126,那么这个数已经是非常非常小的,无限接近于0,M加不加上第一位的“1”,已经没有什么影响了。

3.E全为1

E全为1,即11111111,转换为十进制就是255,那真实的E就是128

128次方,这个数已经是无穷大了。


最后我们一道题目结束:


有缘再会,拜拜!

摸鱼摸鱼😴✨🎞

  • 26
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值