从基本数据类型中我们学到float所占的字节数与int相等,同样的double类型所占的字节数与long相等,那么为什么占用4字节的float要比占用8字节的long所表示的范围还要大呢。当然你也可能猜到了,可能是因为数据的存储形式不同。那么浮点类型和整形的存储形式有什么不同呢
对于单精度float来说一个float类型的数据所占位数为32位其中有一个符号位,指数8位,尾数数23位,
一个浮点数包括整数和小数两部分,当我们输入一个十进制的浮点数时例如30.3
首先先将整数部分转化成二进制,30的二进制为11110
其次是将小数部分转化为二进制,在这里转化成二进制的方式是将0.3*2=0.6,这里整数为0所以小数的第一位是0然后继续0.6 *2 =1.2,此时整数为1 所以我们取得小数第二位是1,然后再取小数0.2 2 =0.4 第三位取0,0.4 * 2=0.8 第四位取0,0.82=1.6 第五位取1 ,0.6 * 2=1.2 第6位取1,可以得到我们小数位为01001100110011…以0011循环
将整数与小数拼接11110.01001100110011在这里我们要转化成科学计数法1.11100100…E4,但是我们这里需要指数也进行二进制化也就是1.11100100…E100
到这里指数为0000 0100 也就是4
但我们在存储指数时规定需要加上0111 1111
也就是以1000 0011作为指数的数值来进行存储
在存储浮点数的时候存储的顺序为符号位 指数 尾数
对于双精度double类型来说
符号一位 指数11位 尾数52位
所以我们在存储指数的时候需要加上011 1111 1111
其他的操作与float类型相似
所以浮点数相比较于整数类型来说能够使用了指数的存储形式虽然准确程度不如整数类型,但是其数值的表达范围要远远大于整数类型。