浮点数在内存中的存储

文章目录


前言

这里是关于C语言进阶内容,关于浮点数在内存中的存储方式的介绍。


一、浮点数的类型

浮点数有两大类型:单精度浮点数和双精度浮点数。双精度浮点数的精准度比单精度浮点数高。


二、例题引导

下面有一道题我们可以看一下,请写出你的答案!

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;
}

答案如下,你是否想对啦!接下来让我们看一看浮点数在内存中是如何存储的!


三.浮点数储存规则

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

         v=(-1)^S*M*2^E

         (-1)^S表示的是浮点数V的符号,S=0表示整数,S=1表示负数。

         M为大于1,小于2的小数。

         E为指数。

这种表示和10进制的科学计数法相似。10进制一般为:5.0*10^2,二进制为1.0101*2^3,

例:十进制的5.5,表示为二进制如图

十进制:5.5=5.5*10^0;

二进制:101.1=-1^0*1.011*2^2;

IEEE 754 规定:
对于 32 位的浮点数,最高的 1 位是符号位 s ,接着的 8 位是指数 E ,剩下的 23 位为有效数字 M

浮点数就是以这种方式存放的,我们发现M的整数位总为1,我们在存放时可以省略,即蓝色部分只存放小数位即可。
对于 64 位的浮点数即双精度浮点数,最高的 1 位是符号位S,接着的 11 位是指数 E ,剩下的 52 位为有效数字 M

 

 但E在存放时是以无符号数来存放的,但在现实中E有正有负,所以我们需要加上一个中间数来使所有的E以正数的形式存放,当使用时,我们再减去即可。

8位的E范围位0到255,11位的E范围为0到2047

对于 8 位的 E ,这个中间数 是 127 ;对于 11 位的 E ,这个中间 数是 1023。
当E为全0时,代表数很小,即为0;当E全为1时,代表数很大,即为正无穷

四.例题讲解

第一个问题n以%d的形式输出即为9。

第二个问题,9的原码在放入float*时会被不一样的形式解读,指数全为0,即这个数无限接近于0,即为0

第三个问题,当float形式的9.0放入%d的形式解读变为1091567616

 第四个问题,9.0当被float的形式输出时为9.0。            


总结

本片主要讲啦浮点数的储存规则,以及不同输出形式的情况下,出现的结果。

希望大家多多支持!你的点赞是我创作的动力!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值