一、读float型数据到内存
#include <stdio.h>
int main() {
float f = 45.125;
printf("\n");
return 0;
}
//00 80 34 42
//分析
/*
>>1. 将小数写成 (-1)^S * M * 2^E
45.104 = 45 + 0.125
45(10) ---> 101101(2)
0.125(10) ---> 0.001(2)
45.104(10) ---> 101101.001(2)
45.125 = (-1)^0 * 1.01101001 * 2^5
>>2. 所以计算出 S M E 的值
S = 0
M = 1.01010001
E = 5
>>3. 将 S M E 存入内存中
S ---> 0
M ---> 01010001
E ---> 5 + 127 = 132 ---> 10000100
0 10000100 01101001 0000 0000 0000 000
S E M 补0
0100 0010 0011 0100 1000 0000 0000 0000
0100 0010 0010 1000 1000 0000 0000 0000
>>4. 表示成十六进制为(内存地址从低到高):
00 80 34 42
*/
二、从内存取float型数据
#include <stdio.h>
int main() {
int a = 10;
float* pa = (float*) &a;
//10存到内存的补码表示为:
//0000 0000 0000 0000 0000 0000 0000 1010 - 补码
//当使用整型去读的话,可以读出它是 10
printf("%d\n", a);//10
//当使用浮点型去读的话,编译器就会认为它是一个浮点型的存储格式,也会使用浮点型的规则来读取
//0 00000000 00000000000000000001010
//S = 0 E = 00000000 M = 00000000000000000001010
//根据 E = 全0 的规则,写出公式格式:
//(-1)^0 * 0.00000000000000000001010 * 2^(1-127)
//可见上式是一个无限接近0的数
//所以编译器会计算出 M 的有效值并且算上精度,即0.000000
printf("%f\n", *pa);//0.000000
//当我们存一个浮点型的数据 20.0 进去
*pa = 20.0;
//20.0的二进制表示为:10100.0
//20.0写成规定公式的形式为:
//(-1)^0 * 1.0100*2^(4)
//S=0 E=4 M=1.0100
//存到内存的 S E M分别为:
//S=0 E=131 M=0100
//转换成二进制:
//S=0 E=10000011 M=0100
//内存中的二进制表示为:
//0 10000011 0100 0000 0000 0000 0000 000
//0100 0001 1010 0000 0000 0000 0000 0000
//如果使用整型去读取,那么编译器就会以整型的存储规则去读取,计算结果是:
//1101004800
printf("%d\n", a);//1101004800
//当使用浮点型去读取浮点型,那没有问题,会使用浮点型的存储规则,可以正确读取20.000000
printf("%f\n", *pa);//20.000000
return 0;
}