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

本文详细探讨了大小端字节序的概念,以及整数(原码、反码和补码)和浮点数(根据IEEE754标准)在内存中的存储方式,包括32位和64位浮点数的结构和转换规则。
摘要由CSDN通过智能技术生成

目录

一.大小端字节序

二.整数在内存中的存储

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


一.大小端字节序

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

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

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


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
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值