Pet*_*ett 12 c floating-point portability endianness ieee-754
我最近一直致力于一个需要存储和加载大量数据的系统,包括单精度浮点值.我决定对整数的网络字节顺序进行标准化,并决定以big-endian格式存储浮点值,即:
|-- Byte 0 --| |-- Byte 1 -| Byte 2 Byte 3
# ####### # ####### ######## ########
Sign Exponent Mantissa
1b 8b, MSB first 23b, MSB first
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想提供类似的功能htonl()和ntohl(),因为我已经使用这些用于擦拭整数,我也希望有尽可能多的平台独立性尽可能的方式来实现这一点(而假设float类型对应于IEEE754 32位浮点值).有没有办法,可能使用ieee754.h,这样做?
我有一个答案似乎有效,我将在下面发布,但它似乎非常缓慢和低效,我会感谢有关如何使其更快和/或更可靠的任何建议.
更简单,并且取决于与您相同的假设(浮点数和整数类型具有相同的字节顺序,并且几乎普遍有效 - 实际上,您将永远不会遇到不是真的系统):
#include <string.h>
float htonf(float val) {
uint32_t rep;
memcpy(&rep, &val, sizeof rep);
rep = htonl(rep);
memcpy(&val, &rep, sizeof rep);
return val;
}
Run Code Online (Sandbox Code Playgroud)
任何相当不错的编译器都会优化掉两个memcpy调用; 它们存在以击败过度严格的别名优化,因此最终会像htonl单个函数调用的开销一样高效.