浮点数因为有小数点,所以和整形等存储就不太一样。
那么就出现了另一种方法:
我们以float来进行讲解,然后double储存是类似的。
首先我们数学中有种数据的表示方法:科学计数法。而我们存储float,double也是差不多的。
-1000.86我们可以写成 (-1)^1 * 1.00086 * 10^3;
10.24我们可以写成 (-1)^0 * 1.024 *10^1;
那么我们把十进制改成二进制:
5.5我们写成二进制:101.1-> (-1)^0 * 1.011 * 2^2
那么我们推广到任意形式: (-1)^S * M * 2^ E
我们只要存储S M E 就行了。
其中E的取值范围是1<=E<2这样保证了E全是1.什么,那么我们就可以将1省掉,只保存小数点后面的数据,这样就可以增加我们的精度。
为什么说叫增加精度呢?因为我们的float和double都是无法都精确保存数据的。我们小数点后一位数是1/2,后第2位数1/4,后第三位数1/3,这导致一些数是无法精确保存或者要很长的二进制数组来保存。
但是还有一个问题,就是如果我们存一个0.0000000000001,我们的E就要存负数,这样我们是不还要额外增加一个比特来存呢?事实不是,我们存入的是数据都是在实际数据上加了127了的。每次运用的时候还需要-127,这样就统一了改变后的数据都为正数。这里我们也不必担心加了之后还是负的。我们看E的内存是不是和char的内存一样,那么-128<=e<=127。但是我们的-128是char中规定的,或许在浮点数里面规定的不同,这样就保证了E>=0。
下面是double的储存形式:
因为浮点数和字符形整型数不同。我们在整形数、字符之间强制类型转换还有可能保证打印的数据不出错,但是我们如果拿给浮点数就彻底出错了。