数据在内存中的存储

1. 整数在内存中的存储

我们之前在讲解操作符的时候,讲过整数的2进制表达方式有三种,原码,反码,补码。

有符号的整数,三种表示方法均有符号位和数值位两部分,符号位都是⽤0表示"正",用1表示"负",最高位的⼀位是被当做符号位,剩余的都是数值位。

我们先来回顾一下:原码,反码,补码

对于整数来说:数据存放到内存中是以二进制的补码来存放的。

为什么呢?

使用补码存放方便运算,可以统一处理。

2. 大小端字节序

当我们了解了整数在内存中的存储后,我们可以发现一个细节

你会发现,我们存储的这个数是以字节为单位,倒着储存的,这是为什么呢?

2.1 什么是大小端

其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分 为⼤端字节序存储和⼩端字节序存储。

以上的这些概念需要牢记。

2.2 为什么会有大小端

当空间存入多字节时,就会产生字节摆动顺序得选择,选择大端,小段两种储存模式。

我们来分析一下前面的时什么储存模式:

int a= 0x11223344,可以看出11是属于高字节,字节高低依次递减,44属于低字节;地址是从低到高的,看到11在最后面,是高字节高地址的情况,符合小端字节序。

3. 大小端字节序模拟实现

我们来了解一下大小端字节序的运行逻辑

我们通过初始化a=1,强制类型转换后,解引用只有两种情况:

这里的&a取的是整个的4个字节,你强制转换成char*类型就可以控制解引用只取第一个字节,通过第一个字节来判断是大端还是小端。

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

我们通过案例来分析一下,n是正整数原,反,补都相等,(float *)&n只是将地址类型强制转换成float指针,并没有修改里面的内容,不会讲9改为9.0。*pFloat拿着n的地址,照着IEEE754 float 浮点数规则,翻译出来就是运行结果,*pFloat=9.0 是通过float指针在n的同一块内存中写入数据,float n=9.0,编译器会按照IEEE754 float 浮点数规则,将9.0编码成 4 字节二进制,覆盖原先n的值。输出%d就是拿着这个二进制,再按按照int 整数规则 解析,得到这个1091567616这个数。

4.1 浮点数的存储

浮点数的存储核心就一个公式:

我们直接通过例子来说明一下怎么使用这个公式:

那这些空间的内存分布呢?

与之前的整数的内存分布还是有很大的区别的,整数只有符号位和数值位。

4.2 浮点数存储过程

4.2.1 浮点数存的过程

IEEE754对有效数字M和指数E,有一些特殊的规定:

对于有效数字M重点就是一定要记住范围是1<=M<2。

对于指数E的话就有点复杂了。

注意:当E出现负数时我们必须通过加上中间数来确保是正数。记住浮点数是无法精确保存的。

4.2.2 浮点数取的过程

指数E从内存中取出还可以再分成三种情况:E不全为0或不全为1(常规情况),E全为0,E全为1。

这种情况比较常规,但是我们一定要记住指数E只有8个bit位。

E全为1

4.2.3 题目解析

我们在前面案例中有个0.000000的情况

我们现在来分析一下为什么全为0;9在整数的形式储存的内存中,其二进制为:00000000 00000000 00000000 00001001, 我们将这个用浮点数的形式拆分开来:

同样的道理,这里面的1091567616也是如此,只不过是浮点数形式存储,以整数形式拆分:

5. 总结

通过一文的学习,我们对内存的存储有了深刻的体会,对于内存空间的大小以及不同类型的存储方式有了更清楚的认知,这其中的浮点数的存储是完全新的知识,也是罕见出现了公式,我们要勤加练习深度理解公式。

相关推荐
wuyk55511 小时前
嵌入式驱动开发:量产级工程化实战(第9篇)——低功耗下的通信可靠性
c语言·驱动开发·stm32·单片机·嵌入式硬件
学逆向的12 小时前
C 突破编译器限制
c语言·开发语言·网络安全
endeavor1213 小时前
can总线(五)
c语言·stm32·单片机·can
老王爱玩车15 小时前
预处理详解
c语言·开发语言·学习
学逆向的16 小时前
C 控制台指令
c语言·开发语言·网络安全
沫璃染墨16 小时前
从零入门数据结构与算法(一):复杂度分析——从算法效率到时间与空间复杂度
c语言·开发语言·数据结构·笔记·算法·飞书
想做小南娘,发现自己是女生喵16 小时前
第三周学习文档 Linux C 多进程与多线程
linux·c语言·学习
听风若依18 小时前
函数栈帧的创建与销毁-重置版
c语言·学习
水饺编程18 小时前
第2章:Linux 基础,pwd 命令
linux·c语言·汇编
鱼很腾apoc18 小时前
【MySQL】 第1期 从核心概念到表约束全解析
linux·c语言·数据库·学习·mysql