数据在内存中的存储(2)

news/2024/7/24 5:27:24 标签: c语言, 数据结构, 数据存储

目录

浮点型在内存中的存储

一、浮点型数字的二进制

二、浮点型在内存中的存储形式

1、浮点型的二进制规范写法:

1.1、普通写法:

 1.2、科学计数法:

1.3、根据国际标准IEEE(电气和电子工程协会) 754的写法: 

2、浮点型在内存中的存储方式:

关于S:

关于M:

 关于E:

转化案例: 

3、关于取出浮点数再内存中的数据

3.1、E不全为0或不全为1

3.2、E全为0

3.3、E全为1



浮点型在内存中的存储

一、浮点型数字的二进制

浮点型数字的二进制形式转化为十进制其实也是和整数型数字转化为二进制一样,通过权重进行运算。


权重详情:http://t.csdn.cn/dw8tX

  • 但不同的是浮点型数字的小数部分。

例如,数字5.5

它的整数部分是5,转化为二进制是101,而小数部分是0.5,拿0.5这么转化为二进制呢? 

其实,小数部分也和权重有关,如下图所示:

小数点的右边一位的权是2的-1次方,所以权重是2的-1次方乘1,也就是得到数字0.5

而小数点的右边的第二位的权是2的-2次方,所以权重是2的-2次方乘1,得到数字0.25

所以进制的小数部分是0.5+0.25=0.75

 

二、浮点型在内存中的存储形式

1、浮点型的二进制规范写法:

1.1、普通写法:

如上文所诉,我们可以得知了5.5的二进制运算法则,那么5.5这个浮点型数字的二进制这么表达呢?

其实上文也有展示,这其实就和普通浮点型的表达形式一样,用小数点将整数部分的二进制和小数部分的二进制分开。

例如:V = 5.5  它的二进制表达数为,101.1 其中小数点将整数和小数部分隔开,也因此,我们也可以直到那个是小数部分的权,那个是整数部分的权。

 1.2、科学计数法:

对于浮点数而言,科学计数法是一个十分方便的写法。

例如:123.45可以写为1.2345*10^2 将小数点朝前移动两位,并乘上10的2次方,使得整数只剩下一位。

  • 而在浮点数的二进制形式中也可以这样写。
  • 例如:V = 5.5 它的二进制写法是101.1 那么使用科学计数法则是 1.011*2^2  和十进制一样,将小数点往前移动两位,但因为是二进制,由于满二进1的原则,所以这里乘的是2的二次方,这和10的2次方是一个道理。

1.3、根据国际标准IEEE(电气和电子工程协会) 754的写法: 

 

其实,这就是科学计数法的一种升级版。

在科学计数法的基础上增加了一个符号位,也就是(-1)^ s 

 (-1)^ s 表示的是一个正负号,当s为0时表达是正数,当s为1时表达的是负数。

例如:

  • V = 5.5
  • 因为5.5是一个正数,所以s为0
  • 所以写法如下:(-1)^ 0 * 1.011 * 2 ^ 2
  • 其中 0 = s       1.11 = M        2^2中的第二个2 表示E  

又例如:

 

2、浮点型在内存中的存储方式:

在IEEE754的规范标准下,浮点型在内存中其实只要存储,S、E、M等即可。

 

关于S:

因为S只是表达正负,所以S存储的是0或1,0表达正数,1表达负数

关于M:

为了将M的存储更为简便,或者说提高精度,我们在存储时只存储小数部分。

例如:

  • V = 5.5 二进制表达方式是 101.1 科学计数法是 1.011,而M在内存中只存储011这个。
  • 而又因为,M在内存中占有23个比特位或者是52个比特位,因此未占满的部分使用0代替。
  • 而只存储小数部分的原因是,通过科学计数法,我们留下了一位整数,这位整数在科学计数法的情况下必然是1,所以我们默认将1省略,只有取出存储数据的时候才会加上。

 关于E:

E的情况较为复杂,因为E必须是一个无符号的整型数值,但是作为科学计数法的E是会出现负数的。

例如:

所以,这时候我们就出现了一个中间值! 

  • 32位浮点数的中间值是127,64位数浮点数的中间值是1023。
  • 当我们的E存入数据中时,必须先加入127或者1023,然后变成二进制形式。 
  •  注意,加上中间值是基本都能修正好这个问题的。

 

转化案例: 

V = 5.5  ——十进制

V = 101.1  —— 二进制

V = 1.011*2^2 ——科学计数法

V =  (-1)^ 0 * 1.011 * 2 ^ 2  —— IEEE754

V =  0 10000001  011 00000000000000000000

V =  4 0 b0 00 00 ——数据存储再内存后,使用16进制再内存块中的展示

————以小端字节进行展示! 

3、关于取出浮点数再内存中的数据

关于取出数据,只需要观察E的情况。

3.1、E不全为0或不全为1

这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1

比如:

0.5 的二进制形式为0.1

  • 由于规定正数部分必须为1,即将小数点右移1位,则为1.0*2^(-1)。
  • 其E再内存应该先为-1+127(中间值)=126,表示为01111110。
  • 而M = 1.0 则去掉整数部分为0,补齐0到23位00000000000000000000000。

所以其最后二进制表示形式为: 

 

3.2、E全为0

全0情况,存储在内存中是加了127或者1023的,而这种加了后还全0的情况那么E就是-127或者-1023,所以这种数字(整个浮点数)表示的就是无限接近与0的数。

那么这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示+0,以及接近于0的很小的数字。

3.3、E全为1

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

 


http://www.niftyadmin.cn/n/5025607.html

相关文章

都2023年金九银十了,这三个项目你还没有?你简历上项目经验写啥

项目一:模拟头条(Web测试项目) 项目概况 模拟头条是一款汇集科技资讯、技术文章和问答交流的用户移动终端产品,类似于今日头条的运营模式,用户通过该产品,可以获取科技资讯,发表或学习技术文章…

C++ Primer Plus 第六章 习题

目录 复习题: 1 .请看下面两个计算空格和换行符数目的代码片段: 2.在程序清单6.2中,用ch1替换ch将发生什么情况? 3.请认真考虑下面的程序: 4.创建表示下述条件的逻辑表达式:a.weight大于或等于115&…

vector模拟实现——关于模拟中的易错点

前言 vector 本质上类似数组,也可以理解为一种泛型的 string。string 只能存储 char 类型,但是 vector 支持各种内置类型和自定义类型。本次将围绕模拟实现 vector 中遇到的问题进行分析。 文章目录 前言一、确定思路二、实现过程2.1 查阅文档2.2 验证…

KALILINUX MSF中kiwi(mimikatz)模块的使用

一、简介: kiwi模块:   mimikatz模块已经合并为kiwi模块;使用kiwi模块需要system权限,所以我们在使用该模块之前需要将当前MSF中的shell提升为system。 二、前权: 提权到system权限: 1.1 提到system有…

MySQL基础终端命令与Python简单操作MySQL

文章目录 MySQL终端命令1. 进入mysql2. 创建数据库3. 选择数据库4. 创建数据表1. 主键约束2. 外键约束3. 非空约束4. 唯一约束5. 使用默认约束6. 设置id为自增列 5. 查看数据表6. 修改数据表1. 修改表名2. 修改表的字段类型3. 修改表的字段名4. 为表添加字段5. 删除字段6. 调整…

APP备案您清楚了吗?

根据近日工业和信息化部发布的《工业和信息化部关于开展移动互联网应用程序备案工作的通知》要求,在中华人民共和国境内从事互联网信息服务的APP主办者,应当依照《中华人民共和国反电信网络诈骗法》《互联网信息服务管理办法》(国务院令第292…

测试架构师的职责及困境

架构师 架构师来自于建筑学,英文是Architect。建筑工程中的架构师是负责整体建筑的架构设计。因此从宏观上看,软件行业的架构师也类似,是负责整体架构的设计。 在软件工程中架构师是一个团队的技术的领头者。主要工作内容除去对项目的整体设…

10个TikTok影响力营销策略,让你的品牌崭露头角

TikTok已经成为一种崭露头角和塑造品牌声誉的强大平台。随着数以亿计的用户在这个短视频应用上分享创意和内容,品牌和营销专业人士也越来越多地将其作为推广产品和服务的渠道。 在本文中,我们将探讨10个TikTok影响力营销策略,帮助你的品牌在…