浮点数在内存中的存储形式
float类型:4字节 32位。
double类型:8字节 64位
由IEEE754规定
对于32位的浮点数,最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M。
对于64位的浮点数,最高位1位是符号位S,接着的11位是指数E,剩下的52位是有效数字M。
公式表示:(-1)^S*M*2^E
M表示有效数字,大于等于 1, 小于2。因为都是1.XXX,所以在存储时省略小数点前的1。
2^E表示指数位。E为无符号整数,当E为8位的时候它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。由于科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。
这是一个例子👇
十进制:0.5
二进制:0.1-->>1.*2^-1--> s = 0 ;M = 1.0; E = -1
32位二进制表示:
上面的E中的 “1” 就是被省略了。
特殊情况:
当E全为0时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第一位的1,而还是还原为0.xxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。
当E全为1时,这是如果有效数字M全为0,表示±无穷大(正负取决于符号位S)