数据在内存中的存储

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. 总结

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

相关推荐
不正经学生8 小时前
C语言预处理详解:编译器真正动手之前的那些事
c语言·开发语言·算法·面试·bug
门思科技8 小时前
LoRaWAN 设备类别:Class A、B、C 对比与选型指南
c语言·开发语言·php
xiaobobo333012 小时前
c语言中for循环条件中定义临时栈变量的作用域
c语言·for循环条件定义栈变量·大括号作用域·独立栈变量
惜离殇13 小时前
从零开始的敲代码生活--Linux应用软件(文件操作基础1)
linux·c语言·文件操作·标准io
潘潘的嵌入式日记14 小时前
I²C 从机接收总被覆盖?双缓冲要在 STOP 时交接
c语言·开发语言·单片机
xx~t16 小时前
嵌入式——Linux软件编程——网络1
linux·c语言·网络·vscode·网络协议
羚尔19 小时前
C语言数组
c语言·开发语言
老当益壮梁奶奶1 天前
Linux软件编程学习笔记(十一):深入浅出 TCP 协议与 Socket 编程实践
linux·c语言·笔记·学习·tcp/ip
Navigator_Z1 天前
LeetCode //C - 1223. Dice Roll Simulation
c语言·算法·leetcode
Patrick在香港1 天前
Python 拉取 C&SD 官方 API:香港 2022 年已跨过“超老龄线“,而抚养比正在爬回 1961
android·c语言·python·数据分析·时序数据库·数据可视化·香港