浮点型在内存中的存储


🍉🍔🍕🍨🍰☕️🍿🍺🍷🍳🎤🎄🚀🎇💥🔥

一、浮点数存储规则

1、根据IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:
(-1) ^ S * M * 2 ^ E
(-1) ^ S表示符号位,当S = 0,V为正数;当S = 1,V为负数。
M表示有效数字,大于等于1,小于2。
E表示指数。
举例:十进制的5.0,写成二进制是101.0,相当于1.01 × 2 ^ 2,得出S = 0,M = 1.01,E = 2;十进制的-5.0,写成二进制是-101.0,相当于-1.01 × 2 ^ 2,得出S=1,M = 1.01,E = 2。
2、IEEE 754规定:
对于32位的浮点数,最高的一位是符号位S,接着的8位是指数E,剩下的23位为有效数字M。
对于64位的浮点数,最高的一位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。
3、IEEE 754对有效数字M和指数E,有着一些特别的规定。

1.1在内存中保存和取出浮点数

1、M的保存:1 <= M < 2,即M可以写成1.××××××的形式,其中××××××表示小数部分。在计算机内存中保存M时,默认这个数的第一位总是1,因此第一位1可以被舍去,只保存后面的××××××部分,比如保存1.01时,只保存01。
M的取出:E不全为0或不全为1,M从内存中取出时,把第一位的1加上去。
这样做的目的是为了提高精度,以32位浮点数为例,留给M只有23位,将第一位的1舍去之后,等于可以保存24位有效数字。
2、E的保存:E为一个无符号整数,即如果E为8位,它的取值范围为0 ~ 255;如果E为11位,它的取值范围为0 ~ 2047。但是科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如:2 ^ 10的E是10,所以保存成32位浮点数时,必须保存成10 + 127 = 137,即10001001。
E的取出:E不全为0或不全为1,E取出时,E的计算值减去127(或1023),得到E的真实值。
E全为0,E真实值加上127等于0,即E真实值为-127,+/- * 1.×××××× * 2 ^ -127表示的是很小的数(接近0),这时,浮点数的指数E等于1-127(或者1-1023),得到E的真实值。这时,M从内存中取出,M不再加上第一位的1,而是还原为0.××××××的小数。这样做是为了表示+/-0,以及以及接近于0的很小的数字
3、E全为1:E的真实值加上127为255,即E的真实值为128,+/- * 1.×××××× * 2 ^ 128表示的是很大的数,表示+/-无穷大(在浮点数中)。

1.2浮点数存储的例子

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

执行结果:在这里插入图片描述
1、以整型的视角,存放整型的数据9,存放的是00000000000000000000000000001001,以浮点型的视角取出时,S = 0,后面八位的指数E = 00000000,最后23位的有效数字M = 00000000000000000001001。由于指数E全为0,所以浮点数V写成:V = (-1) ^ 0 × 0.00000000000000000001001 × 2 ^ (-126) = 1.001 × 2 ^ (-146),显然,V是一个很小的接近于0的正数,用十进制小数表示就是0.000000。
2、以浮点型的视角,存放浮点型的数据9.0,浮点数9.0等于二进制的1001.0,即1.001 × 2 ^ 3。那么,第一位的符号位S = 0,有效数字M等于001后面加上20个0,凑满23位,指数E等于3 + 127 = 130,即10000010,写成二进制的形式应该是S + E + M,即01000001000100000000000000000000。以整型的视角取出,用十进制整数表示就是1091567616。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值