在 C 语言中,浮点数在内存中的存储方式为:符号位,指数,位数。float 与 double 类型的数据在计算机内部的表示法是相同的,但由于所占存储空间的不同,其分别能够表示的数值范围和精度不同。如下所示:
成都创新互联公司服务项目包括大关网站建设、大关网站制作、大关网页制作以及大关网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,大关网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到大关省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!下来我们就来讲讲关于浮点数的转换:1、将浮点数转换成二进制;2、用科学计数法表示二进制浮点数;3、计算指数偏移后的值。注意:计算指数时需要加上偏移量,而偏移量的值与类型有关。那么实数 8.25 在内存中的 float 该怎么表示呢?8.25 的二进制表示:1000.01 ==> 1.00001 * (2 ^ 3);符号位:0; 指数:127 + 3 ==> 130 ==> 1000 0010; 小数:00001 所以内存中8.25的 float 表示:0 1000 0010 0000 1000 0000 0000 0000 000 ==> 0x4104 0000
我们在 Linux 中做个 8.25 的转换实验,看看它是否在内存中表示为 0x4104 0000,代码如下:
#includeint main() { float f = 8.25; unsigned int* p = (unsigned int*)&f; printf("0x%08X\n", *p); return 0; }
我们看到打印出的结果如下,确实是我们分析的那样。
在 C 语言中,int 类型的范围为:[ -2^31, 2^31 - 1]; float 类型的范围是:[ -3.4 * 10^38, 3.4 * 10^38 ]。float 能表示的具体数字的个数与 int 相同。可表示的数字之间不是连续的,存在间隙。它只是一种近似的表示法,不能作为精确数使用。由于内存表示法相对复杂,float 的运算速度比 int 慢的多。注意:double 与 float 具有相同的内存表示法,因此 double 也是不精确的。由于 double 占用的内存较多,所能表示的精度也就比 float 高。
下来我们做个实验,以验证 float 所表示的数是不精确的,代码如下:
#includeint main() { float f = 3.1415f; float fl = 123456789; printf("%0.10f\n", f); printf("%0.10f\n", fl); return 0; }
我们看到打印结果如下,我们期望的 f 本应该是3.141500000,f1 本应该是 123456789.0000000000,可是结果是 f = 3.1414999962; f1 = 123456792.0000000000。这也从侧面证实了我们说的是正确的,用浮点数表示的数字是不精确的。
那么关于浮点数,我们可总结为:1、浮点类型与整数类型的内存表示法不同;2、内存表示更加复杂;3、可表示的范围更大;4、是一种不精确的类型;5、它的运算速度比较慢。关于浮点数的相关知识我们就先学习到这了,后面我们继续学习 C 语言的其他知识。
欢迎大家一起来学习 C 语言,可以加我QQ:243343083。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。