C语言(长期更新)第18讲:数据在内存中的存储
C语言(长期更新)第18讲
数据在内存中的存储
跟着潼心走,轻松拿捏C语言,困惑通通走,一去不回头~欢迎开始今天的学习内容,你的支持就是博主最大的动力。
博主主页:潼心1412o-CSDN博客
目录
C语言(长期更新)第18讲
数据在内存中的存储
知识回顾
18.1 整数在内存中的存储
18.2 大小端字节序和字节序判断
18.2.1 什么是大小端
18.2.2 练习
18.3 浮点数在内存中的存储
18.3.1 浮点数存的过程
18.3.2 浮点数取的过程
知识回顾
上节课我们学习了内存函数,今天我们来学习内存函数,坐稳了,我们发车,gogogo,出发喽!
18.1 整数在内存中的存储
对于整数,内存中存放的是补码
原因有三:
使用补码可以将数值域和符号位统一处理
加法减法也可统一处理(CPU只有加法器)
补码原码之间的转换,运算过程相同,不需要额外的硬件电路
18.2 大小端字节序和字节序判断
18.2.1 什么是大小端
只要数据超过一个字节,就有存储顺序的问题
大端(存储)模式
数据低字节内容保存至内存高地址,高字节低地址
小端(存储)模式
低字节低地址,高字节高地址(在数字的存储上表现为倒着放)
18.2.2 练习
练习一
简述大小端概念,设计一小程序判断当前机器的字节序
思路:以1为例,大端末尾就是1,小端存储就是0
怎么拿到末位呢?可强制类型转换
注意不要直接强制类型转换为char
而是要先取地址再强制转换为char*类型,再解引用
why?因为只有解引用地址访问才是低地址的内容,而强制转换为char,语法没有规定,不同编译器处理不同,会导致结果不稳定。但是强转为char*后解引用,访问的一定是低地址的内容
练习二
注意存的时候要发生截断,打印的时候要提升
练习三
练习四
在完成这道题之前,首先我们需要先思考一个问题
char类型的取值范围为什么是-128到127
我们经过规律总结,得到一个圈
下面我们再来看这段代码
这下看懂了
练习五
unsigned char的取值范围是0~255,所以说条件很成立,陷入死循环
道理和前面一样,unsigned int一定是大于等于0的,所以条件恒成立导致死循环的产生
练习六
18.3 浮点数在内存中的存储
浮点数家族包括float double long double
浮点数取值范围在float.h中定义
我们先来看段代码
这段代码的运行结果可能会和我们设想的不大相同
怎么个事呢
我们发现,浮点数和整数的存储大不相同
在国际标准IEEE(电气电子工程协会)754中规定
任意一个二进制浮点数可以表示为以下形式
V = (-1)^S * M * 2^E
- (-1)^S 表示符号位,当S=0,V为正数;当S=1,V为负数
- M 表示有效数字,M是大于等于1,小于2的(其实就是1点几)
- 2^E 表示指数位
IEEE 754规定:
对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M 对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
18.3.1 浮点数存的过程
IEEE 754 对有效数字M和指数E,还有⼀些特别规定。
计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后⾯的小数部分。⽐如保存1.01的时候,只保存01,等到读取的时候,再把第⼀位的1加上去。这样做的⽬的,是节省1位有效数字。
指数E,情况就⽐较复杂
⾸先,E为⼀个⽆符号整数(unsigned int)取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存⼊内存时E的真实值必须再加上⼀个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。⽐如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。
18.3.2 浮点数取的过程
取的过程分为三类
1.E小数部分非全0或全1
先加127,还原M的真实值;再加上省去的1,还原E
2.E全0
加过127还是0,说明这个数非常小,我们将它视作0
3.E全1
那就已经非常大的数了,视作无穷,具体±看S
这下这个题就解决了
好了今天的学习内容就到这里啦,谢谢你的陪伴,我是潼心,下次再见~如果这篇文章对你有帮助的话。请务必给主播一个一键三连,球球了,这对主播很重要~
博主主页:潼心1412o-CSDN博客