脚本宝典收集整理的这篇文章主要介绍了【C语言进阶3——数据的存储(3)- 浮点型数在内存中的存储与取出】,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
本文接着学习数据的存储相关的内容,主要学习浮点型数在内存中的存储与取出。
int main()
{
int n = 9;
float *pFloat = (float*)&n;
printf("n的值为:%dn",n);
printf("*pFloat的值为:%fn",*pFloat);
*pFloat = 9.0;
printf("num的值为:%dn",n);
printf("*pFloat的值为:%fn",*pFloat);
return 0;
}
乍得一看,输出结果是: 9 、9.0、9、9.0
运行结果见下图:
num 和 *pFloat 在内存中明明是同一个数,但是浮点数和整数的解读结果会差别巨大,要理解这个结果,需要理解浮点数在计算机内部的表示方法。
根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:
举例说明:
对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M
对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M
E为一个无符号整数(unsigned int)
但是,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数:
1、E不全为0或不全为1
2、E全为0
3、E全为1
int main()
{
float f = 5.5; //浮点数
101.1 二进制表示
(-1)^0 * 1.011* 2^2 IEEE 745规定
s=0 //代表正数
E=2 //代表指数,左移2位 ,存储是时要+127 =129
M=1.011 //有效数字
0 10000001 01100000000000000000000
0100 0000 1011 0000 0000 0000 0000 0000
0x40 b0 00 00 小端存储
}
由上面分析可知,浮点数5.5在内存的存储形式见下图:
调试程序发现结果与分析过程一致,并且是小端存储。int main()
{
float f = 0.5; 浮点数
0.1 二进制表示
(-1)^0 * 1.0*2^-1 IEEE 745规定
S = 0 代表正数
M = 1.0 有效数字
E = -1 代表指数,右移1位 ,存储是要+127 =126
0 01111110 00000000000000000000000
0011 1111 0000 0000 0000 0000 0000 0000
0x3f 00 00 00
return 0;
}
由上面分析可知,浮点数0.5在内存的存储形式见下图:
调试程序发现结果与分析过程一致,并且是小端存储。下面对 3.1的例子进行讲解:
int main()
{
int n = 9;
第一步:正数9在内存存储的形式:
00000000000000000000000000001001
float *pFloat = (float*)&n;
第二步:将正数强制转换位浮点型,认为pfloat指向的内容是浮点数
存储在内存中的形式
0 00000000 00000000000000000001001
0000 0000 0000 0000 0000 1001
0x00 00 00 09
s=0
E= -126 因为E是全为0的特殊情况,取出就是1-127固定的
M= 0.00000000000000000001001 后面23位都是小数位
第三步:从内存中取出浮点数
(-1)^0 * 0.00000000000000000001001 * 2^-126
结果为极限接近0的非常小的数
printf("n的值为:%dn",n); 输出9
printf("*pFloat的值为:%fn",*pFloat);输出浮点数0.00000
*pFloat = 9.0;
第一步:浮点数9.0的二进制形式:
1001.0
(-1)^0 * 1.001 * 2^3
s=0
E=3 代表指数,左移3位 ,存储是要+127 =130
M=1.001
第二步:浮点数9.0在内存存储的形式:
0 10000010 00100000000000000000000
0100 0001 0001 0000 0000 0000 0000
0x41 10 00 00
第三步:%d打印,上面的补码就是正数的补码了,三码合一
打印原码: 1,091,567,616
printf("num的值为:%dn",n);
printf("*pFloat的值为:%fn",*pFloat); 9.0
return 0;
}
此时再看结果,就会一目了然了:
- 输出浮点数0.00000,浮点数在内存的存储形式 0x00 00 00 09,小端存储形式:
两个浮点数不能直接判断是否相等,应该判断他们之间的差值是否在一个给定范围内,满足自己的使用要求即可。
int main()
{
int a = 0;
if (a == 1)//整数可以直接判断
{
}
float b = 0.00001;//基本接近0,但不是0
if (b==0.0)//不能这样判断,会出问题
{
}
}
数据的存储相关内容是C语言进阶阶段的第一个知识点,与整形提升关系密切,还要熟悉变量类型、符号位、类型范围、原码反码补码、等等,这部分内容更多的牢记变量存储类型的性质,不能想当然的去考虑结果,每一步的思考都要有依据才行。
要温故而知新,通过这部分的学习,给自己在以后的程序找错中,提供了不一样的思路。
下一篇开始学习指针进阶的内容了。
以上是脚本宝典为你收集整理的【C语言进阶3——数据的存储(3)- 浮点型数在内存中的存储与取出】全部内容,希望文章能够帮你解决【C语言进阶3——数据的存储(3)- 浮点型数在内存中的存储与取出】所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。