代码之家  ›  专栏  ›  技术社区  ›  rampion

以IEEE754交换格式记录/读取C双精度

  •  3
  • rampion  · 技术社区  · 15 年前

    所以我在为跨平台使用序列化一个C数据结构,我想确保以跨平台的方式记录我的浮点数字。

    我本来打算这么做的

     char * pos;
     /*...*/
     *((double*) pos) = dataStructureInstance->fieldWithOfTypeDouble;
     pos += sizeof(double);
    

    但我不确定字节是否会记录在 char * 采用IEEE754交换格式的数组。我以前曾被跨平台问题(endian ness和whatnot)咬过。我有什么需要做的吗? double 获取交换格式的字节?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Matthew Slattery    15 年前

    C实现根本不需要使用IEEE754表示,因此任何基于直接访问 double 无论如何也不会是真正的便携设备。

    如果 您假设只使用那些确实以IEEE754格式表示双精度的系统,而endianness是唯一的担心(并且您假设一个字节的big-endian序列与一个字节的little-endian序列是唯一的选项!)…然后,您可以在运行时使用具有已知二进制表示形式的某个值探测endianness(同样,您可以通过查看0x12345678是否以0x12或0x78作为第一个字节存储来测试整数)。

    (如果你是 真的? 考虑到可移植性,我不确定还有比使用 sprintf() strtod() ,并假设您不一定比相关规范(如C99规范第5.2.4.2.2节)要求的绝对最低精度更高。)

    推荐文章