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