浮点数由三部分组成,如下图,符号位s、指数e和尾数m。
S: 表示浮点数正负,1为负数,0为正数
E: 8位以2为底,阶码=阶码真实值+127(0111 1111)
M: 23位,存储小数点左边的数据,右边的最高位被隐藏,规格化被隐藏的是1,非规格化被隐藏的是0。
17.625换算成二进制位:10001.101 ( 0.625 = 0.5+0.125) ;再将 10001.101 向右移,直到小数点前只剩一位10001.101=1.0001101 x 24。
S=0,E=127(0111 1111)+4(0000 0100)=1000 0011,M=0001 101(因为规格化小数点前必为1,所以IEEE规定只记录小数点后的就好,所以此处底数为 0001101 )
综上所述,17.625的 float 存储格式就是:
0 1000 0011 0001 1010 0000 0000 0000 000
阶码真实值的取值范围是-126到+127。阶码=阶码真实值+127,即:1<=阶码<=254。阶码占8位,可以表示0到255。0和255十分特殊。
1、当E=255时
1.1 当M全为0时,则表示无穷大,若S为1则为负无穷大,若S为0则为正无穷大。
1.2 当M不全为0时,表示NaN(Not a Number)。
2、当E=0时
2.1 当M全为0时,表示的真值为0,结合符号位S 为0或1,有正零和负零之分。
2.2 当M不全为0时,表示非规格化小数。这种情况下,阶码真实值为-126,不是0-127=-127。小数点左边隐藏的最高位是0, 不是1。
注:浮点数不存在原码、反码、补码 概念。因此会出现正零和负零。
double类型和float类型是理解方式是一样的,只是占的位数不一样。