浮点型在内存中的存储详细讲解(第四期)

目录

 1.一个例子

2.浮点数存储的规则

    2.1 有效位M的一些特殊规定

    2.2 有效位E的一些特殊规定

3.详细解读‘一个例子’


常见的浮点数类型:

float 单精度浮点型

double 双精度浮点型

long double 长精度浮点类型

1.一个例子:(看看得到的答案是多少)

int main()
{
 int n = 9;
 float *pFloat = (float *)&n;
 printf("n的值为:%d\n",n);
 printf("*pFloat的值为:%f\n",*pFloat);
 *pFloat = 9.0;
 printf("num的值为:%d\n",n);
 printf("*pFloat的值为:%f\n",*pFloat);
 return 0;
}


2.浮点数存储的规则

我们可以看到,num和*pFloat在内存中明明是同一个数,为什么浮点数与整数的解读结果会差别这么大?
要理解这个结果,一定要搞懂浮点型在计算机内部的表示方法。

详细解读 :

根据国际标准IEEE(电气和电子工程协会)745,任意一个浮点型可以表示成下面的形式:

表示方法-用科学技术法:1^S*M*2^E

下面我们以float x = 9.0的例子来详细分析一下浮点数存储的规则:

大家对十进制的二进制比较熟悉这里转换为二进制是一样的;十进制中以10为底来表示,同理二进制中以2为底,八进制中以8为底。符号以(-1)^S来表示,当s为1时则浮点数为负数,s为0时则浮点数为正数。

下面我们需要来知道浮点数各个位置的分区情况:

 在单精度浮点型32位比特位中我们可以了解得到由IEEE 754规定的各个分区情况

S(符号位)占1个比特位

E(指数位)占8个比特位

M(有效位)占23个比特位

双精度浮点型64位比特位中我们可以了解得到由IEEE 745规定的各个分区情况

S(符号位)占1个比特位

E(指数位)占11个比特位

M(有效位)占52个比特位 

 2.1.有效位M的一些特殊规定

下面我们再来分析一下IEEE 745对于有效位M的一些特殊规定:

M的取值范围为: 1<= M < 2,也就是说M写成1.xxxxxxxx的形式,其中xxxxxxx代表的是小数点的部分。

IEEE 745规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxx部分,比如保存M = 1.001时,只需要保存001就行了,等到读取的时候,再把第一位的1加上去,这样做的目的,是节约1位有效数字,以32位浮点数为例,留给M的只有23位,将第一位1舍去以后,等于可以保存24位有效数字。下面我们以图示来形象理解:


 

2.2对于指数位E的特殊规定

下面我们再来分析一下IEEE 745对于指数位E的一些特殊规定:

首先,E为一个无符号整数

这意味着,如果E为8位,他的取值范围为0~255;如果E为11位,他的取值范围为0~2047。但是,我们知道,科学计数法中的E可以出先负数的,所以IEEE 745规定,存入内存时E的真实值必须再加上一个中间值,对于8位的E,这个中间数是127;对于11位的E,这个中间是1023。比如,2^3的时候这个E为3,所以保存在32位浮点数中时,必须保存为3+127=130;即1000 0010;

下面我们用图示来形象理解:

 

然后指数E从内存中取出还可以分成三种情况:

E不全为0或不全为1时:

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

比如:

0.5的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为1.0*2^(-1),其阶码为-1+127=126,表示为01111110,而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,其将二进制表示形式为;

0 01111110 00000000000000000000000 

下面我们用图解来详形象理解一下:

 E全为0时:

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

 E全为1时:

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

 好了浮点数的规则就说到这里了。


3.详细解读‘一个例子’

现在我们用以上的规则再来详细的看前面的那一个例子:

先看第一个输出:9

定义整形变量n等于9,然后以%d的形式打印出来,我相信大家都没有问题。

 第二个输出:0.000000

这里将整形变量n强行转换为浮点型指针然后指向给指针Pfloat,然后输出。下面我们用图像详细理解。 

显然是一个非常接近0的数字,所以十进制用小数点表示就为0.00000;

 第三个输出为:1091567616

这里我们将浮点型Pfloat以十进制整数的形式打印出非常大的数据,下面我们还是以图解的形式来详细理解。

 所以就会以整数的形式来读取内存条,所以出现一个非常大的数值。

 第四个输出:9.0

浮点数Pfloat以%f的形式打印出9.0.这个就不用多说了。


 

有关数据的存储一共分为四期,就一共归纳完毕啦!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C-Sakura

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值