float型: 4字节 32bit
高位 -> 低位
首先将数转换为二进制,如下格式:
打个比方:
发现M中,小数点前必为1,所以可以默认没有必要存储,所以实际可以存储24bit的M,因为小数点前唯一一位必为1;
参考:
对于E,会采用unsigned型存储,所以为了使其可覆盖到部分负数,会加上一个中间值,float存储中E占8位,加中间值127,使E的范围变成[ -127, 128 ];
double存储中E占11位,加中间值1023,使E的范围变成[ -1023, 1024 ]
参考:
打开clion,验证一下十进制浮点数 9.5 在c语言内存中的存储:
先自己模拟一下:
s = 0, M = 0011, E = 3 + 127 =130
高位 -> 低位
s: 0 E: 100;0 001;0 M: 001;1 000;0 000;0 000;0 000;0 000
将其用0x表示得:
高位 -> 低位
0x 41 18 00 00
转为小端存储:(高地址存高位,低地址存低位)
低地址 -> 高地址
0x 00 00 18 41
debug 发现四字节中存储内容为 0x 00 00 18 41 计算正确!
上题:
int n = 9; 高位 -> 低位 // 0000 0000; 0000 0000; 0000 0000; 0000 1001
float * p = (float *)&n; // s = 0 +; // E = 0000 0000 - 127, 2^-127 // M = 1. 000 0000 0000 0000 0000 1001 // 因为 E全0,为很小的数字 M第一位直接改0以接近0 // 所以最终结果为 (-1)^0 * 0. 000 0000 0000 0000 0000 1001 * 2^-127
*p = 9.0; // (-1)^0 * 1.001 * 2^3 // s:0 E:3 + 127 = 130; M: 001 // 0 1000 0011 0010 0000 0000 0000 0000 000 // 0 100;0 001;1 001;0 000;0 000;0 000;0 000;0 000 // 高位 -> 低位 // 0x 41 90 00 00 // 低地址 -> 高地址 // 小端存储: 00 00 90 41 printf("%d\n", n); // 2^30 + 2^24 + 2^23 + 2^20 printf("%f\n", *p); // 9.0
运行结果: