float在内存中的数据格式及其转byte数组原理及转换过程
float在计算机的存储
四个字节
,共有32位。以“符号
”+“移位数
”+“底数
”的方式存储。
三者的计算
第一位是符号,往后8位
是“移位数”,再往后23位
是“底数”。
32位的格式排列就是
ABBB BBBB BCCC CCCC CCCC CCCC CCCC
-
A表示
符号
,正数为0,负数为1 -
B表示
移位数
,占了8个字节,所以能表示的大小为0~255。但是,移位数肯定是有正负之分,- 当读取这里的值要减去127,故float的移位数可从 -127到128.
- 当存储这里的值要加上127,故float的移位数可从 -127到128.
-
C表示底数,底数的计算方式,
- 当读取该值的时候,看例子一,先在C前面补上1.,意思就是把23个C看成是小数(比如是10100000 0000 0000 0000 0000,我们所要的数就是1.10100000 0000 0000 0000 ),然后根据移位数的值进行移位,再转成十进制的数据
- 当存取该值的时候,例子二,把数据转为二进制,然后进行移位,直到小数点前面有且只有一位1,然后,把1.去掉,剩下的放到底数位,后面补上0。
例子一:
比如 我现在的数据是 65,72,0,0,
转为二进制
01000001 01001000 00000000 00000000
那进行三部分拆分,就是 A:0,B:10000010,C:1001000 00000000 00000000
A部分为0,表示正数
B部分值为130,这移位数就为3
将C值进行转换 1.1001000 00000000 00000000,
根据B值移位2,就变成了 1100.1000 00000000 00000000,
用二进制转十进制算法(@为移位数符号) 12@3+ 12@2+ 02@1+ 02@0+ 12@-1+ 02@-3+。。。
算出结果为12.5
例子二:
比如 我现在的数据是 17.625
先将数据转成二进制(可以查看参考链接,小数进制转换),变成10001.101,
原则–直到小数点前面有且只有一位1—》 可以算出需要将这个数变成1.0001101
所以,底数就是 0001101,移位数为4+127=131,符号为正的,所以就是
01000001 10001101 00000000 00000000
byte数组就是 65,-115,0,0