首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >一篇文章讲透——计算机中的数据存储原理

一篇文章讲透——计算机中的数据存储原理

作者头像
小此方
发布2025-12-24 17:27:16
发布2025-12-24 17:27:16
60
举报

◆ 博主名称: 小此方-CSDN博客

大家好,欢迎来到小此方的博客。

🔥个人专栏:《C语言》_小此方的博客-CSDN博客

🔥 努力成就未来,代码改变世界,相信我有一天也能成为改变世界的那个人


一,整数在内存中的存储

一,一切的开始:编码

1,认知:

➤整数的二进制表示方法有三种:即原码;反码;补码。

有符号整数的三种表示方法均有符号位和数值位两部分:在二进制序列中,最高位的一位被当作符号位,其余各位属于数值位。

➤ 符号位的表示规则:

◆ 0:表示正。

◆ 1:表示负(注意这里有点反着来的感觉,不要记错了

➤ 小总结:

◆ 正整数(无符号数)的原码反码和补码相同。

◆ 负整数(有符号数)的原码反码补码各不相同。

2,转化

➤三条规则

◆ 原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。 ◆ 反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。 ◆ 补码:反码+1就得到补码。(补码得到原码也是可以使用:取反,+1的操作。

➤一图流

存储形式

◆ 原码是人类可以看懂的形式。

◆ 补码是机器存储的形式。

原因

◆ 使用补码,可以将符号位和数值域统⼀处理;

◆ 加法和减法也可以统⼀处理(CPU只有加法器

◆ 补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

二,大小端字节序

1,引子
代码语言:javascript
复制
#include <stdio.h>
int main()
{
   int a = 0x11223344;
   return 0;
}

开启调试:如图(此图借用比特就业公司)

我们发现0x11223344在内存中是倒着存放的:原因是什么?

2,大端字节序和小端字节序存储模式

当需要存储的数据超过⼀个字节时,会存在存储顺序问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储:

大端存储模式

是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处。

小端存储模式

是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存在内存的高地址处。

一图流

3,为什么会有大小端字节序存储(可跳过)

这个术语据说源于《格列佛游记》。在小说中,小人国内部分裂为“大端派”(从大头敲破鸡蛋)和“小端派”(从小头敲破鸡蛋)。计算机科学家们幽默地借用了这个典故。(doge)

核心是计算机设计早期,不同的芯片制造商在如何处理多字节数据在内存中的存储顺序上,做出了不同的、但各自合理的决定。这背后没有统一的标准,导致了延续至今的分歧。 在如今计算机系统中,我们以字节为单位的,每个地址单元都对应着⼀个字节,一个字节为8 bit 位,但是在C语言中除了8bit的char 之外,还有16bit的short 型,32bit的long 型(要看具体的编译器),另外,对于位数⼤于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于⼀个字节,那么必然存在着⼀个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

二,浮点数在内存中的存储

一,浮点数的存储规则

1,浮点数家族(基础,可跳过)

➤ 科学计数法:(例)1E10(表示1的是次幂)。

➤ 类型汇总: float 、 double 、 long doubl。

➤ 浮点数表示的范围:<float.h> 中定义。

2,计算

国际标准 根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成

(-1)^{S}*M*2^{E}
(-1)^{S}*M*2^{E}

解读

(-1)^{S}
(-1)^{S}

表示符号位,当S=0,V为正数;当S=1,V为负数。 ◆ M表示有效数字,M大于等于1,小于2。 ◆

2^{E}
2^{E}

表示指数位。

举例

例一:十进制5.0 (转化为二进制)------> 二进制101.0 (科学计数法表示)-------->1.01*2^2 【S=0;M=1.01;E=2】 例二:十进制-5.0 (转化为二进制)------> 二进制-101.0 (科学计数法表示)-------->-1.01*2^2 【S=1;M=1.01;E=2】

3,存储

➤ IEE754规定

◆ 对于32位的浮点数,最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数

字M。

◆ 对于64位的浮点数,最高的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。

➤ 一图流(图片借自比特就业公司)

4,存入规则

➤ IEE754对有效数字M的特殊规定

组成:M二进制浮点数由整数部分+小数部分组成(如:101.101整数部分是101,小数部分是0.101)

操作:存储时,因为[M]=1,所以默认M第一位为1,被舍去,保留小数部分。

目的:节省一位有效数字,以32位浮点数为例,留给M的空间有23位,将第一位的1舍去后,等于可以保存24位有效数字。

➤ IEE754对指数E的特殊规定

结论:E在存入时要加上一个中间数字,对8位的E这个中间数是127;对于11位的E这个数字是1023。

原理:

1,为什么要有中间数字:存入的E是一个无符号整数,科学计数法的E是一个有符号数字,如何统一两者?————加一个中间数字再存储。

2,为什么是127(1023)存入的E为8位,是无符号整数,取值范围为0~255;E为11位,取值范围为0~2047;

科学计数法E为8位时,有符号整数整数,取值范围是[-128,127];11位时,取值范围是[-1024,1023]。不需解释,硬性规定。

5,取出规则

➤ 情况一:E不全为0或1

◆ 规则:E计算值减去127(或1023),得到真实值,再将有效数字M前面加上1。

◆ 举例:0.5(十进制)的二进制形式为0.1,规定正部分部分必须为1,将小数点向右移动一位:1.0*2^(-1),E=-1,-1+127=126,表示:01111110,有效数字M去掉整数位上的1后为0,补齐到23位,结果:

0 01111110 0000000000000000000000

➤情况二:E全为0

此时,E=1-127(1-1023),有效数字不再加上第一位的1,因为在极小的指数面前,任何乘数都变得没有意义,此时表示的是一个非常接近0的数字——有时我们会拿来表示±0,

0 00000000 0000000000000000000000

➤情况三:E全为1

此时,如果有效数字全为0,表示正负无穷大(正负号取决于s)

0 11111111 00010000000000000000000

至此,所有数据存储的理论部分就全部介绍完了,感谢您的收看。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一,整数在内存中的存储
    • 一,一切的开始:编码
      • 1,认知:
      • 2,转化
    • 二,大小端字节序
      • 1,引子
      • 2,大端字节序和小端字节序存储模式
      • 3,为什么会有大小端字节序存储(可跳过)
  • 二,浮点数在内存中的存储
    • 一,浮点数的存储规则
      • 1,浮点数家族(基础,可跳过)
      • 2,计算
      • 3,存储
      • 4,存入规则
      • 5,取出规则
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档