十进制转IEEE 754步骤详解
在做嵌入式开发或者处理浮点数传输的时候,经常会遇到一个问题:怎么把一个常见的小数,比如3.75,变成计算机内存里存的那串二进制?这时候就得用到IEEE 754标准。它规定了浮点数在计算机中是怎么表示的,最常见的就是单精度(32位)格式。
下面一步步带你走完这个转换过程,不绕弯子,直接上干货。
第一步:确定符号位
符号位最简单,正数是0,负数是1。比如你要转的是-3.75,那符号位就是1;如果是3.75,那就是0。
第二步:把十进制数转成二进制
先处理整数部分。3转成二进制是11。再看小数部分0.75,用“乘2取整”法:
- 0.75 × 2 = 1.5 → 取1,剩下0.5
- 0.5 × 2 = 1.0 → 取1,结束
所以0.75的二进制是.11,合起来3.75就是11.11。
第三步:规格化二进制数
IEEE 754要求写成1.xxxx × 2^n的形式。把11.11右移一位变成1.111 × 2^1。指数就是1。
这时候小数点前的1是固定的,称为“隐含位”,存的时候不用写进去,省一位空间。
第四步:计算阶码(指数偏移)
单精度浮点数的阶码占8位,采用偏移量127。当前指数是1,加上127得到128。
128转二进制是10000000,这就是阶码部分。
第五步:提取尾数
规格化后的数是1.111,去掉前面那个1,剩下的小数部分就是尾数。这里只有111,后面要补0凑够23位。
所以尾数是:
11100000000000000000000
第六步:组合三部分
IEEE 754单精度一共32位,分三段:
- 符号位:1位
- 阶码:8位
- 尾数:23位
以3.75为例:
- 符号位:0
- 阶码:10000000
- 尾数:11100000000000000000000
拼起来就是:
0 10000000 11100000000000000000000
按字节分开:0100 0000 0111 0000 0000 0000 0000 0000
对应的十六进制就是:0x40700000
举个实际场景
你在调试一个工控设备,通过内网穿透连接到远程PLC,读到一串数据是0x40700000。你知道这是float类型,就可以反过来推:这是3.75。反过来,如果你要下发一个浮点参数,也得先把数值转成IEEE 754格式再发过去,不然对方解析出来就是错的。
代码示例:手动模拟转换
下面是Python中查看IEEE 754表示的小技巧:
import struct
# 把3.75转成32位浮点,再转成对应整数表示
data = struct.pack('f', 3.75)
hex_value = struct.unpack('I', data)[0]
print(hex(hex_value)) # 输出: 0x40700000这样你就能看到内存里真实的样子了。
搞懂这套流程,以后在做网络协议解析、数据透传、跨平台通信时,遇到浮点数就不会懵了。