二进制文件包含了太多的数据,如何看懂二进制文件,决定于基础。
文章目录
- 前言
- 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个十分之一
我的理解:计算机没有特定存储小数,只是变化了一种方式。
**/
通过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