数据在内存中,有int short char 等等---他们在limit.h中定义
而double float long double 在float.h中定义
IEEE S(符号位) E(指数) M(有效数字)
(-1) ^ s * M * 2 ^ E
对于32位(单精度)来说 第一位分配给S 接着8位分配给E ,剩下的23位分配给M
/ - -------- -----------------------
S E M
对于64位(双精度)来说 第一位分配给S 接着11位分配给E ,剩下的52位分配给M
/ - ----------- ----------------------------------------------------
S E M
对于M来说,因为要存储的是1.--- (默认个位数的第一个总是) 所以,统一的把第一个1去掉,等到读取的时候再把1加上
E是一个无符号数,但是我们通常存储数据的时候,会遇到负值,所以存入内存值时,需要加上一个中间数,对于8位的E,这个中间值是127,对于11位的E,这个中间值是1023。比如2^10次方的E是10,存储的时候存在内存中的是10+127=137,即10001001
0.5的二进制是0.1
E不为全0也不为全1 则E需要减去一个127(1023)
E位全0时 浮点数E为 1-127或者1-1023,即为真实值,有效数字(M)不再加上第一位的1,而是还原为0.xxxxxxxxx的小数,表示无限接近于0
E位全1时 不做相应讨论,有效数字(M)全部为0;表示+-无穷大(正负取决于正负号)