C++ 在不同平台/架构上浮动和加倍

问题描述

就上下文而言,我正在为 Arduino 开发一个库,以通过 LoRa 接收器传输数据包。

我的问题是,库将来自浮点数和双精度数的原始位放入 uint8_t 数组,发送它们,然后将它们传输回浮点数和双精度数。

当编译器、平台和体系结构相同时,这当然有效,但是在解压它们并简单地将数据直接复制到其他平台(如 Windows 或 Linux 上的 C++)上的浮点数时,我会遇到问题吗?

我当然可以使用整数并有一些因素来保留小数位,但这会增加复杂性,我宁愿以某种方式解决

解决方法

如果您的实现使用 ieee754 浮点数,并且还有无符号的 32 位和 64 位整数,那么很可能在浮点数和 32 位整数之间以及双精度数和 64 位整数之间存在一一对应关系。这完全适用于我在过去十年中使用的 100% 的实现。 (长双精度更可变)。

因此,您可以将浮点数移动到 32 位无符号整数中,通过将 x>>24、x>>16、x>>8 和 x 存储为任意固定顺序的字节,以某种固定顺序存储四个字节,并且以相同的顺序读回它们。与 64 位双精度相同。

或者,您可以像 JSON 一样将数字存储为文本。

,

如果您只是使用 memcpy 浮动和双精度,那么无论编译器如何,您都可以在同一平台上使用。

一旦您尝试 memcpy 结构或类,您将需要相同的编译器版本和设置。这是一个巨大的蠕虫罐头。只需检查此站点上有关填充的问题数量即可。它会回来咬你的背面。

出于所有实际目的,现在就咬紧牙关,转换为整数或使用序列化工具包(json、protobuf 等)。如果您担心性能,一旦您将序列化为整数或文本,请添加可选的 memcpy 模式,其中握手通过交换消息来验证兼容性,然后选择任一方法。