录制/读取C以IEEE 754交换格式加倍

时间:2010-04-23 19:45:51

标签: c serialization double ieee-754

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

我一直在计划着做

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

但我不确定这些字节是否会以IEEE 754交换格式记录在char *数组中。我以前被跨平台问题所困扰(endian-ness和诸如此类别)。有什么我需要做的double来获取交换格式的字节吗?

1 个答案:

答案 0 :(得分:2)

C实现根本不需要使用IEEE 754表示,因此任何基于直接访问double的二进制表示的解决方案都不会真正可移植。

如果你认为你只会使用代表IEEE 754格式双打的系统,并且字节顺序是唯一的担心(你假设一个大端序列字节与小端字节序列是唯一的选项!)...然后你可以在运行时使用一些已知二进制表示的值来探测字节顺序(就像你可以通过查看测试整数一样查看0x12345678是否存储了0x12或0x78作为第一个字节。)

(如果你真的关注可移植性,我不确定有没有比使用sprintf()strtod()更好的选择,并假设你可能没有必须具有比相关规范要求的绝对最小值更精确的精度,例如C99规范的5.2.4.2.2节。)