浮点数与十六进制互转:IEEE 754、字节序与 Modbus 寄存器

发布于 2026年9月16日
更新于 2026年10月8日
工具指南
7 分钟阅读

把 3F800000 转成浮点数,再看 3.14 为什么不能精确还原。附四种字节序示例,以及两个 Modbus 寄存器读取 FLOAT32 的方法。

IEEE 754
FLOAT32
十六进制
浮点数转换
Modbus
字节序

浮点数与十六进制互转:IEEE 754、字节序与 Modbus 寄存器

读到 3F 80 00 00,为什么一个软件显示 1065353216,另一个却显示 1?前者把这四个字节当作 UINT32 整数,后者按 IEEE 754 的 FLOAT32 格式解释。字节没有变,改变的是读取它们的规则。

整数的进制转换保留数值:十进制 255 写成十六进制就是 FF。浮点数转 HEX 则是在查看存储这个数的位模式,所以浮点数 1 会得到 3F800000。同样,FFFF 按 UINT16 是 65535,按 INT16 是 -1。使用转换器前,需要从设备手册确认的是数据类型,而不只是“这是十六进制”。

用同一组数据比较转换结果

下表的链接会在数据转换器中填好输入格式、数值、类型和字节序,可以直接替换输入,观察结果。

任务(点击打开示例)输入数据类型 / 字节序结果
HEX 转十进制整数FFUINT16 / AB255
十进制整数转 HEX255(十进制)UINT16 / AB00 FF
HEX 转浮点数3F800000FLOAT32 / ABCD1
浮点数转 HEX3.14(十进制)FLOAT32 / ABCD40 48 F5 C3
低字节在前0000803FFLOAT32 / DCBA1
寄存器内字节交换803F0000FLOAT32 / BADC1
两个寄存器交换00003F80FLOAT32 / CDAB1
无符号 16 位整数FFFFUINT16 / AB65535
有符号 16 位整数FFFFINT16 / AB-1

UINT16 占两个字节,所以十进制 255 会显示为 00 FF,前面的零用于保留位宽。16 位数据的顺序写作 AB 或 BA;32 位数据有四个字节,才会出现 ABCD、DCBA、BADC、CDAB 这些选项。

要解析 3F 80 00 00,选择“十六进制”、FLOAT32 和 ABCD,右侧 DEC 结果就是 1。FLOAT32 使用四个字节;手册若指定 FLOAT64 双精度,则需要完整的八个字节。这两种格式都包含符号、指数和小数部分,具体位分配可查阅 Oracle 的 IEEE 浮点数格式说明。

输入应当只包含这个数的数据字节。拿到完整的 Modbus RTU 响应时,可以先用报文解析器找到数据区,去掉设备地址、功能码、字节计数和 CRC,再进行数值转换。

3.14 后面多出来的小数位

在 3.14 转 HEX 示例中,四个字节是:

40 48 F5 C3

把它们按 FLOAT32 读回来,显示值是 3.140000104904175。3.14 无法用有限位二进制小数精确表示,写入 FLOAT32 时只能舍入到附近可表示的值。显示更多小数位,就会看到这点差异;把显示保留两位小数,看到的仍然是 3.14。

FLOAT64 有更多有效位,能够减小这类舍入误差,但也不能精确表示所有十进制小数。设备要求 FLOAT32 时,应保留这个类型:改成 FLOAT64 会把长度从四字节变为八字节,改成整数则会换一套编码规则。显示的小数位数可以调整,设备的数据格式不能因此改变。

两个 Modbus 寄存器怎样组成一个数

一个 Modbus 寄存器是 16 位,FLOAT32 因此占两个寄存器。协议规定单个寄存器的高字节先发送;至于两个寄存器中哪个存放浮点数的高 16 位,要看设备手册。Modbus 应用协议规范的第 4.2 节说明数据编码,第 6.3 节给出读取保持寄存器的响应格式。

假设手册规定高字在前,读到的两个寄存器是 0x3F80、0x0000。按读取顺序拼成 3F 80 00 00,选 FLOAT32、ABCD,结果为 1。若设备低字在前,读到的就是 0x0000、0x3F80;保留原顺序输入 00 00 3F 80,选 CDAB,也会得到 1。

这里的 A、B、C、D 是一个 32 位数从最高有效字节到最低有效字节的标签,不是寄存器地址。ABCD 保持这个顺序,CDAB 交换两个 16 位字,BADC 交换每个字内部的两个字节,DCBA 则将四个字节全部反转。保留收到的数据顺序,由转换器完成交换即可;先手动交换,再选交换选项,会把数据换回去。

BADC 可以用来解释已经被日志软件或网关重新排列的数据。看到工具提供这个选项,并不意味着标准 Modbus 允许单个寄存器在线路上传输时把低字节放在前面。排查时也要分清楚,手中的 HEX 来自原始报文,还是软件整理后的寄存器视图。

一个“正常”的结果还不能证明读对了

读错起始地址,也可能把相邻的两个寄存器拼出一个落在量程内的浮点数。因此不能轮流尝试字节序,找到看着顺眼的结果就结束。先在寄存器表中确认起始地址、类型和占用数量,再按手册中的字序解析,最后与设备显示或已知测量值核对。Modbus RTU 读取实操中有请求和响应的检查过程。

结果特别大或接近零时,先检查是否取齐了字节、是否错了地址,以及类型和字序是否匹配。结果只差 10 倍或 100 倍,则应查看手册中的倍率、单位和偏移;转换器不会从字节中猜出这些信息。至于输入过长或无效,通常需要回到原始数据,检查是否混入了报文头、校验码或非 HEX 字符。

相关文章

浮点数与十六进制互转:IEEE 754、字节序与 Modbus 寄存器 | ModbusKit