#define _CRT_SECURE_NO_WARNINGS 1 //浮点型在内存中的存储方式: //国际IEEE协会,任意一个二进制浮点数V可以表示为: //(-1)^S*2^E*M //(-1)^S表示符号位(0or1),当s=0时,V为正数;当s=1时,V为负数 //2^E表示指数位(次方)(存储的是8个正数,没有负数) E+127并转化为2进制的数(8bit) //M表示有效数字,大于等于1,小于2(存储时,一定是1.xxx,所以不存1,直接存储小数点后面的位,不够全部补0 // 直到所有数的数位为23)如1.001,存储为00100000000000... // 如十进制的0.5,二进制是0.1-->2^(-1)*1.0--->s=0;E=-1;M=1.0 float型:-1+127=126(存在E的8bit中)double型:-1+1023=1022(存在E的11bit) // 存储顺序为 s(1位) E(8或11位) M(23或52位) //float型(32bit) :s(放第1bit) E(放8bit) M(23bit) //double型(64bit):s(放第1bIT) E(放11bit) M(52bit) //例:5.5---->101.1(二进制)--->2^2*1.011--->(-1)^0*2^2*1.011 s=0 E=2(次方)+127=129 M=1.011 // 5.5存储为 0 10000001(129) 01100000000000000000000(011后面全补0至总数为23) // 改写为0100 0000 1011 0000 0000 0000 0000 0000 // 转化为16进制 4 0 (11)b 0 0 0 0 0------->40b00000 //float型(32bit) :s(放第1bit) E(放8bit) M(23bit) //double型(64bit):s(放第1bIT) E(放11bit) M(52bit) //浮点型在内存中的取出方式: //E分成三种情况: //E不全为0或不全为1时:E-127或E-1023 M在最前面+1 //E为全0时:规定E=1-127(因为E为全0时,说明此时E+128=0;E=-128时,-128+127=-1,E此时为负数, // 可理解为1.xxx乘以2的负127次方,非常非常小) ,M不再+1,而是还原为0.xxx) //E全为1时:(因为E=127时,E是一个无穷大的数),是一个无穷大的数,不讨论 //例子 int main() { int n = 9;//4byte(字节) float* pFloat = (float*)&n; printf("n的值为:%d\n", n);//9 用整形方式存储和取出 printf("pFloat的值为:%f\n", *pFloat);//0.000000 用整形方式存储,用浮点型方式取出 *pFloat = 9.0;//用浮点型的视角存储9.0 printf("n的值为:%d\n", n);//1091567616 用浮点型方式存储,用整形方式取出 printf("pFloat的值为:%f\n", *pFloat);//9.000000 用浮点型方式存储和取出 return 0; } //第二次打印是整形放置,浮点型取出 //解释:第二次打印结果为9,化为2进制: 0 00000000 00000000000000000001001 //变为 s E(全为0,1-127) M(全为0,M前面+0.) //含义: + 2*(-126)次方 0.00000000000000000001001 //即为 0.0000000000000000000000000000 //第三次打印是浮点型放置,整型取出 //解释:9.0--->二进制1001.0---->1.001*2^3 E=3(此时需要+127) M=1.001(存储的是001,外加20个0) // 0 10000010 00100000000000000000000 //此时因为取出为整形,所以该数为正数,为01000001000100000000000000000000---->1091567616