浮点型在内存中的存储

一、浮点类型

1.1 浮点数

浮点数的本质是数学中的小数。
如,123.45 可以写成 12.345*10^1,也可以写成1.2345*10^2 ,小数点可以移动,所以叫浮点数。

1.2 浮点类型

1.2.1 字面浮点数

浮点数有两种表示方法,一种是直接写出来的小数,如123.45;另一种是使用 E来表示,如1E10表示的是1.0*10^10

1.2.2 浮点数类型

float : 单精度浮点型(4 byte)
double :双精度浮点型(8 byte)
long double :多精度浮点型(8 byte)

二、浮点型的存储

2.1 二进制的权重

在这里插入图片描述
可以看到,二进制整数部分的权重是,124…;小数部分的权重是,0.50.250.125
示例: 在这里插入图片描述

注意: 有些数字,如3.14的小数部分 0.14 在转为二进制时,因为小数权重的原因,可能永远没法碰巧凑为0.14,那就会不断通过10来尽可能的接近,所以后面可能会有很多位。

2.2 浮点数格式

根据国际标准 IEEE754,任意一个二进制浮点数都可以表示成一种固定格式:
在这里插入图片描述

  • (-1)^S :表示符号位,当 S = 0,V是正数,当 S = 1时,V为负数。
  • M :表示有效数字,M >= 1 并且 M< 2。
  • 2^E:表示指数位。

例如:
在这里插入图片描述

因为任意一个二进制浮点数都可以表示成上述形式,所以存储一个浮点数,只要存S,M,E就行。

三、存储时的内存分布

3.1 S M E 所占的存储空间

在这里插入图片描述
在这里插入图片描述

3.2 S

当V是正数时,S = 0
当V是负数时, S = 1

3.3 M

因为 1<=M<2,所以 M 可以写成 1.xxxxxx的形式,在计算机保存 M 时,会默认这个数的第一位总是1,因此可以被舍去,只保存后面的.xxxxxx部分。
这样做的目的,是节省1位有效数字,多一位来放小数部分,精度会提高。

3.4 E

3.4.1 内存中存储的 E 的值

E为一个无符号整数(unsigned int),把 8/11 个比特位中存储的数据当成一个无符号数看待,这意味着E的范围不可能为负数。

  • 如果E为11位,它的取值范围为0~2047
    如果E为8位,它的取值范围为0~255

但科学计数法中的E是会出现负数的,如:
在这里插入图片描述
所以,为了解决这个问题,IEEE 754规定,存入内存时E的真实值必须再加上一个中间数。

  • 对于8位的E,这个中间数127
  • 对于11位的E,这个中间数是1023

在这里插入图片描述

无论 E 的正负,都要加中间数,只是这种操作是为负数的 E 设定的,但既然设计了那就正负统一操作,便于管理。

3.4.2 从内存中取出的 E

3.4.2.1 E不全为0或不全为1

指数E的计算值减去127(或1023),得到真实值,再取出 M+1,得到真实的浮点数。

在这里插入图片描述

3.4.2.2 E全为0

是加上中间数后存了0,所以真实值应该是-127(或 -1023),E 是 -127,此时数字已经相当小了,无限接近于0
规定:

  • E的真实值为(1-127)/(1-1023)
  • 有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的值。

在这里插入图片描述

3.4.2.3 E全为1

加上中间数后是全1,即255,那的真实值应该是 128,此时数字是相当大的。
如果有效数字M全为0,表示±无穷大(正负取决于符号位s)。

在这里插入图片描述

3.5 示例

在这里插入图片描述

本文到此就结束啦,如果有帮助到您,希望可以得到您的一个赞!(如有哪里有错漏,望您指点!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值