浮点数编码转换的是IEEE规定的编码标准,IEEE规定将浮点数拆分为3部分,符号、整数、尾数。float和double这两个类型的原理都差不多,但是由于表示的精度不一样,有些许的差别。
float类型的IEEE编码。
float类型在内存中占4个字节(32位),最高位表示符号,从左向右取8位表示指数,其余23位用于表示尾数。
例如:12.25f
将起转换为二进制是:1100.01
整数部分是1100.
小数部分是01.
将小数点向左或向右移动,直到小数点最左边除却符号位是1为止。
即此时需要向右移动三位。
三位几位指数位的数值。
于是,12.25f经过转换后是:
符号位:0
指数位:127+3。即10000010 (为什么要加127(二进制01111111) IEEE规定,小于01111111的指数位为负数)
尾数位:10001 000000000000000000不足23位,用0填充
故最后的结果是 0 10000010 10001 000000000000000000
十六进制是0x41440000
在内存中以小尾方式排列为 00 00 44 41
值得注意的是 double最高位同样表示符号位,指数位占11位,剩余42位表示用于位数。
在float中,指数范围中加127表示符号正负,同样double扩大了精度,指数范围中加1023表示符号正负,其他方法和float一样。