浮点数存储规则

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

对于浮点数的存储规则,可以分为两部分来说,一部分是存储规则,另一部分是读取规则

存储规则:

比如定义一个浮点数5.0,按照上面的公式可以转换为:5.0->101.0->1.010*2^2->(-1)^1*1.010*2^2。

对照上面的公式,可以得出S=1,M=1.010,E=2,我们的最终目的是将浮点数转换为32位或64位浮点数存入内存,那么得出S,M,E的值后,显然还要继续进行一些转换

对于float数据类型开辟的32位空间来说,第一位是符号位,也就是S所存入的位置,第二位到第九位是E所存入的位置,第十位到第三十二位是M所存入的位置

 对于S符号位来说,如果是正数就填入“0”,如果是负数就填入“1”。

对于E来说,在存入内存时,如果是单精度浮点数存储模型,需要将E=E+127,再转换成二进制存入内存,如果是双精度浮点数存储模型,需要将E=E+1023,再转换成二进制存入内存。

对于M,因为M总是一个1.XXXX形式的数字,所以在存入内存时,只需要存入XXXX(XXXX后面补“0”到23位),在读取时只需要添上“1.”即可

读取规则:

在对32位或64位浮点型数据进行转换时,符号位是0就代表该数为正,符号位为1就代表该数为负

若第二位到第九位全为0,则M复原时不必在前面添上“1.”,而E等于1-127;

若第二位到第九位全为1,则该浮点数为无穷大

若第二位到第九位不全为0,则E等于其转换为十进制后减去127,M前添上“1”即可。

举例来说:

#include <stdio.h>
int main()
{
	float a = 5.0;
	int* p = (int*)&a;
	printf("%d", *p);
	return 0;
}

定义一个单精度浮点数,按照上面的步骤不难得出其二进制序列为:0 1000 0001 0100 0000 0000 0000 0000 000,将其强制转换为int类型,可以验证其二进制序列的正确性,得出结果为:

 

#include <stdio.h>
int main()
{
	int n = 9;
	float* pFloat = (float*)&n;
	printf("%d\n", n);
	printf("%f\n", *pFloat);
	return 0;
}

int型9的二进制序列为:0000 0000 0000 0000 0000 0000 0000 1001,将其强转为float型时,第二位到第九位数字全为零,所以输出结果也是一个无限趋近于0的数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

马孔多镇长

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

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

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

打赏作者

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

抵扣说明:

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

余额充值