double类型存储规定:把浮点数化成小数点前只有1位的小数与2的指数的乘积的形式,存储小数点后的52位,2的指数及数的符号。
sizeof(double) // 8个字节
#include <stdio.h>
//利用共用体的特点,所有类型共用一段最大的内存空间
typedef union {
double d;
char byte[8];
}BIT;
int main()
{
int i;
BIT u;
u.d = 10.2345;
for(i = 0; i < 8; ++i) {
//16进制输出
printf("%02x ",u.byte[i]);
}
putchar('\n');
return 0;
}
输出结果:
计算机数据的读写方向为从右到左,即左高右低;
所以修改为:
40 24 78 10 62 4d d2 f2
转化为二进制:
0100 0000 0010 0100 0111 1000 0001 0000 0110 0010 0100 1101 1101 0010 1111 0010
前12位为2指数:0100 0000 0010 -> 1026
后52位小数部分:0100 0111 1000 0001 0000 0110 0010 0100 1101 1101 0010 1111 0010
当指数为0时,对应二进制位0011 1111 1111 -> 1023
所以上式对应二进制指数为1026 -1023 = 3;
double型小数点前只有1位1,所以剩下的52位小数部分
0100 0111 1000 0001 0000 0110 0010 0100 1101 1101 0010 1111 0010
结果为: 1.小数部分 * 2^指数部分;
1.0100 0111 1000 0001 0000 0110 0010 0100 1101 1101 0010 1111 0010
化为10进制数为:1.279312500000000074606987254810519516468048095703125
乘以 2 ^ 3得:
10.234500000000000596855898038484
验证浮点型的近似型,所以尽量不对浮点型进行== 和!= 判断,否则可能会产生意想不到的结果。
float类型基本类似,只是有8字节变为4个字节,博客链接
float类型存储
参考资料:《程序员入门必备 狂人C》