#include <stdio.h>
int main()
{
int num = 9;
float *pFloat = #
printf("num 的值为:%d\n",num);
printf("*pFloat 的值为:%f\n",*pFloat);
*pFloat = 9.0;
printf("num 的值为:%d\n",num);
printf("*pFloat 的值为:%f\n",*pFloat);
return 0;
}
运行结果:
产生上述结果的原因:浮点数在计算机中的表示与整数在计算机中的表示存在差异
int num = 9;
上面这条语句声明并定义了一个整型 int 变量 num 为 9;在普通的 32 位计算机中,用四个字节表示 int,其二进制表示为:
00000000 00000000 00000000 00001001
根据国际标准 IEEE 754,任意一个二进制浮点数 V 可以表示为下面这种形式:
V = (-1)^{s} · M · 2^{E}
如题例,十进制的 9.0 , 写成二进制位 1001.0, 相当于: 1.001 · 2^{3} , 其中 s=0,M=1.001,E=3 ; 十进制的 -9.0 , 写成二进制为 -1001.0 , 相当于: -1.001 · 2^{3} , 其中 s=1,M=1.001,E=3 ;
有效数字 M:
IEEE 745 规定,对于 32 位的浮点数,最高的一位是符号位 s,接着的 8 位是指数 E,剩下的 23 位为有效数字 M: 对于 64 位的浮点数来说,最高的一位仍为符号位 s,接着的 11 位是指数 E,剩下的 52 位为有效数字 M: 另外,前面提到,1<= M <21.x_1x_2x_3x_4 的形式,其中 x_1x_2x_3x_4 表示小数部分。IEEE 754 规定,在计算机内包存 M 时,默认这个数的第一位为 1,因此可以被舍去,这样子就可以节省一位有效数字位,使得 32(64)位浮点数可以保存 24(53)位的有效数字。
指数 E 的情况稍微复杂一些:
首先,E 是一个无符号整数(unsign int), 着意味着当 E 为 8 位时,其取值范围为 0 到 255;若 E 为 11 位其取值范围为 0 到 2047。但是我们知道,科学计数法中的 E 可以是负数,因此,E 的真实值必须减去一个中间值。对于 8 位的 E 应减去 127,对于 11 位的 E 应减去 1023;
比如说, 2^{9} 的 E 是 9,所以保存成 32 位浮点数时,必须保存为 E = 9+127=136, 即 10001000。
还原 E 的真实值时还可以分成 3 种情况:
到此,回顾最初的问题。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有