浮点数在内存中的存储

目录

1.引例

2.浮点数在内存中的储存

3.题目解析

4.完


1.引例

#include <stdio.h>
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.浮点数在内存中的储存

那么浮点数在内存中到底是如何进行存储的呢?

我们以8.5在x86环境下举例,8.5的二进制为1000.1,然后我们用科学计数法,1000.1 = 1.0001 * 2^3(因为是二进制,所以乘以2的次方),那么最后存储的方式就是:

0 10000010 00010000000000000000000,这32个比特位储存的就是浮点数8.5。

我们来解析一下:

我把32个比特位分成了三段,他们从前向后分别的含义是

S : 高位表示数字正负 0表示正数 1表示负数

E : 这里8bit表示的是2的次方的次方数的二进制+173

M :后面的23bit就是数字的主体,不过8.5的主体不应该是10001吗,为什么是0001呢?

原因是这里的28bit默认认为开头是1,所以把1省略,这样还能空出来1bit来进行存储。

3.题目解析

#include <stdio.h>
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;
}

这里再回头重新看题目:

第一个 9 应该没什么问题,把int 的9 以%d形式打印

第二个  0 ----->   

9的二进制 ----->1001 补全  ----> 00000000000000000000000000001001 

这里如果用浮点数的形式打印,那么内存就认为打印的数是浮点数,那么其储存的形式就应该是浮点数的储存形式。根据上面的讲解,其第二部分E也就是2的次数+173为0,那么次数也就是-173,这明显是一个很小的数。把他还原成浮点数------> 1.1001 * 2^-173 ~ 0 

第三个 初始化为一个浮点数,那么存储的时候就直接以浮点数的形式存储,

0 10000010 00100000000000000000000 ,若将这个二进制序列以%d的形式打印,其必然是个大数 

第四个    以浮点数形式打印浮点数,正常输出9.0

4.完

浮点数在内存的储存方式就讲到这里,如果有不对请提出。

谢谢观看。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值