大家都知道,整数在内存中的存储,就是把整数转换成16进制,存放在相应的位置,但是float,double类型的存储是以完全不同的方式存储的,以下是存储方式:(32位操作系统)
(-1)^x * e * 2^y
x y+127 e -1
0 00000000 00000000000000000000000(32bit二进制)
第一位:(-1)^0,当第一位是0时,表示正数,当第一位是1时,表示是负数
中间8bit,表示无符号:y+127
后面23bit,表示e-1(因为1<=e<2,所以为了方便,直接把前面的整形1舍弃)
小数:10.5
用二进制表示:1010.1 (2^3+0^2+2^1+0^0. 2^-1)
用科学记数法表示:1.0101 * 2^3
所以10.5这个小数在内存在的二进制存储是:
第一位是0,后面8位是10000010( 3+127=130),接着的23位是0101(1.0101 - 1),所以最后的二制进是:0 10000010 01010000000000000000000
最要读取这个二进制数时:首先读第1位 0,表示这个数是正数
然后y = 中间8位表示的10进制数 - 127
最后0.0101 + 1 = 1.0101
(-1)^0 * 1.0101 * 2^3 = 1010.1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "game.h"
int main()
{ float a = 10.0;
//1010.0 二进制
//(-1)^0 * 1.0100 * 2^3
//0 10000010 01000000000000000000000(1092616192)
int *p = &a;
printf("%d\n",*p);
printf("%lf",a);
return 0;
}