为什么在 C/C++ 中处理浮点字节序转换很困难?

问题描述

交换一堆字节看起来很容易,但我总是喜欢在库可用时使用它们。所以我偶然发现了 Boost.Endian,当我发现它处理整数而不是浮点时,我感到很惊讶。浮点字节序有什么特别之处? (我阅读了 Boost.Endian exaplantion,但它不能满足我的好奇心)。

特别是我想理解这一点:如果 Boost.Endian 已经提供了交换 4 和 8 字节整数的函数,为什么不简单地将这些函数应用于浮点数和双精度数?

解决方法

所以我偶然发现了 Boost.Endian,当我发现它处理整数而不是浮点时,我感到很惊讶。浮点字节序有什么特别之处?

documentation 解释了原因:

尝试支持四字节浮点数和八字节双精度数,仅限于 IEEE 754(也称为 ISO/IEC/IEEE 60559)浮点数,并进一步仅限于浮点字节序与整数没有区别的系统字节序。即使有这些限制,对浮点类型的支持也不可靠并被删除。例如,简单地反转浮点数的字节序可以导致信令 NAN。出于所有实际目的,整数的二进制序列化和字节序是同一个问题。对于浮点数而言,情况并非如此,因此浮点的二进制序列化接口和格式不适用于基于字节序的库。

因此,问题与语言无关,而与系统使用的底层浮点格式有关。

作为示例提到的信令-NAN 会导致 POSIX 系统上的进程默认中止。在更改字节顺序时,这通常是不受欢迎的结果。