C语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit, 遵从IEEE的规范,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。
无论是单精度还是双精度在存储中都可以分为三个部分:
- 符号位(Sign) : 0代表正,1代表为负
- 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
- 尾数部分(Mantissa):尾数部分
float型浮点数double型浮点数
任何一个数都可以用科学计数法表示为1.xxx*,尾数部分就可以表示为xxxx,因为第一位都是1,所以可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了24bit。那24bit能精确到小数点后几位呢,我们知道9的二进制表示为1001,所以4bit能精确十进制中的1位小数点,24bit就能使float能精确到小数点后6位,而对于指数部分,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127-128了,所以指数部分的存储采用移位存储,存储的数据为元数据+127。双精度浮点数的存储和单精度的存储大同小异,不同的是指数部分和尾数部分的位数,不再赘述。