float浮点/double双精度浮点和二进制的相互转换,小白也能看明白!

二进制文件包含了太多的数据,如何看懂二进制文件,决定于基础。

文章目录

  • 前言
    • 1、重点知识
      • 1.1何为二进制文件
      • 1.2浮点和双精度的浮点如何生成二进制
        • 1.2.1 float和double的基础知识
        • 1.2.2 IEEE754约束的重点
        • 1.2.3 浮点是如何表示二进制
      • 1.3 例子说明
    • 双精度double的转换方式一样,可以参考float的说明。


前言

`提示:无规矩不成方圆,我们先看一下IEEE754对float和double的约束,点击查看

1、重点知识

1.1何为二进制文件

二进制文件,故名思意就是进制为2的文件。

1.2浮点和双精度的浮点如何生成二进制

在没有统一之前,各个公司对其的操作方式不一,导致系统间的耦合性非常低。那么自然需要形成一个统一的局面。IEEE 754自然应运而生,形成了一套约束方案。

1.2.1 float和double的基础知识

名称 字节长度 对应位数
float 4字节 32位
double 8字节 64位

1.2.2 IEEE754约束的重点

名称 符号位Sign长度 Expont指数 Fraction小数长度 位元长度e
float 1 需计算 需计算 8
double 1 需计算 需计算 11

这里先说明一下:指数偏移值(exponent bias),即浮点数表示法中指数域的编码值,等于指数的实际值加上某个固定的值。e为存储指数的位元的长度。

1.2.3 浮点是如何表示二进制

在这里插入图片描述

1.3 例子说明

-------------------------------
这里是伪代码,只做逻辑上面的说明!
-------------------------------
1、将float 类型的3.14转换成二进制,该如何思考?
/**
首先将3.14拆解成3和0.14两个部分。
整数部分3对应的二进制:0011
小数部分0.14该如何转换成二进制呢?计算的时候为什么要乘以2取整数作为二进制的数呢?下面我们看一个说明:
0.14里面有多少个0.5  0.14/0.5=0.14*2=0.28 结果是0个
0.14里面有多少个0.25  0.14/0.25=0.14*4=0.56 结果是0个
0.14里面有多少个0.125 0.14/0.125=0.14*8=1.12 结果是1个,此时满2进1了。
(0.14-0.125)里面有多少个0.0625  0.015/0.0625=0.015*16=0.24  结果为0
以此类推~,知识变换了一种方式,整数部分除以2,小数部分乘以2
我们类比一下十进制的数:100.1 整数部分有10个10(100/10),小数点0.1有1个十分之一
我的理解:计算机没有特定存储小数,只是变化了一种方式。
**/

float浮点/double双精度浮点和二进制的相互转换,小白也能看明白!_第1张图片

通过1.2.3的介绍,我们整合的结果为:11.0010001111010111000011 ,将其转化成指数形式:1.1.0010001111010111000011*2^1
在IEEE中规范,在二进制,第一个有效数字必定是“1”,因此这个“1”并不会存储。

符号位sign:正数为0,负数为1 此题的符号位为:0
Exponent:指数位1,但实际值=指数值加上固定偏移值2^(位元长度8-1)-1=127,十进制数位127+1=128,其二进制结果位:10000000
Fraction长度(32-1(符号位长度)-8(位元长度)-exp因子数):22
eg:这里说明一下整数3的二进制为11占用了两位,32位-位元长度8-符号位长度-整数部分占用的位数,则为22位!

最后我们整合为:浮点3.14的二进制结果为:0 10000000 10010001111010111000011 ,
方便阅读,从右到左每4位进行组合:0100 0000 0100 1000 1111 0101 1100 0011
转化成十六进制则为:0x4048f5C3

双精度double的转换方式一样,可以参考float的说明。

你可能感兴趣的:(深入理解Java虚拟机,java)