//根据国际标准IEEE(电气和电子工程协会)745,任意一个二进制浮点数V可以可以表示成下面的形式:
//V=(-1)^S * M * 2^E(注:该公式里边的E指的是E的真实值,接下来提到的二进制序列里边的E为E的计算值,计算值=真实值+中间数;中间数在32bit和64bit下分别是127和1023)
//(-1)^S表示符号位,当S=0,V为正数;当S=1,V为负数。(S只有两种可能值:0或者1)
//M表示有效数字,大于等于1,小于2
//2^E表示指数位
//举例说明:
//十进制的5.5,写成二进制是101.1,相当于1.011 * 2 ^ 2
//特别注意:二进制序列的浮点数,小数点后面第一位的权重为2的(-1)次方、第二位的权重是2的(-2)次方、第三位是2的(-3)次方、……以此类推
//按照V的格式,可以得出S=0(正数),M=1.011,E=2
//浮点数存储的例子(以32bit为例)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int n = 9;
//9存储在内存中的二进制序列:00000000000000000000000000001001
float* pFloat = (float*)&n;
printf("n的值为:%d\n", n); //9
printf("*pFloat的值为:%f\n", *pFloat); //0.000000
//以浮点型打印首先要从内存中取出二进制序列,再以浮点型数据的存储规则来计算最终结果:
//二进制序列是一样的:00000000000000000000000000001001,float型是32bit位的浮点数,其中第一位是S,紧接着后面8位是E的计算值,最后的23位是M的小数部分
//0 00000000 00000000000000000001001(S E M)
//是E全为0的情形,此时M不再加上整数部分的1,E=1-127=(-126),即V=(-1)^0*0.00000000000000000001001*2^(-126)
//显然V是一个很小且接近0的正数,用十进制小数表示就是0.000000
*pFloat = 9.0;
printf("num的值为:%d\n", n); //1091567616
//十进制浮点数9.0写成二进制是1001.0=1.001*2^3,是正数,即32bit为浮点数中S=0,E=3+127=130,M=00100000000000000000000(001后面再补20个0,共需补齐23bit位)
//E=130,二进制位为:10000010
//所以但浮点数9.0存储在内存中的二进制序列为:01000001000100000000000000000000( S(1bit) E(8bit) M(23bit) )共32bit位
//现在用%d来打印即以十进制整型打印出来,二进制序列中第一位为0,即为正数,原码、反码、补码相同,所以最终打印的数据就是以二进制序列01000001000100000000000000000000为原码的一个数,其数值是1091567616
printf("*pFloat的值为:%f\n", *pFloat); //9.000000
return 0;
}