1

如果我使用以下内容测试我的代码:

#ifndef __STDC_IEC_559__
    #error Warning: __STDC_IEC_559__ not defined. The code assumes we're using the IEEE 754 floating point for binary serialization of floats and doubles.
#endif

...如此处所述我是否保证:

float myFloat = ...;
unsigned char *data = reinterpret_cast<unsigned char*>(&myFloat)

unsigned char buffer[4];
std::memcpy(&Buffer[0], data, sizeof(float));

...会安全地序列化浮点数以写入文件或网络数据包吗?

如果没有,我怎样才能安全地序列化浮点数和双精度数?

另外,谁负责字节排序——我的代码还是操作系统?

为了澄清我的问题:我可以将浮点数转换为 4 个字节并加倍为 8 个字节,并安全地在文件之间或跨网络进行序列化,如果我:

  1. 断言我们正在使用 IEC 559
  2. 将结果转换为标准字节顺序(例如网络字节顺序)。
4

2 回答 2

2

__STDC_IEC_559__是由 C99/C11 定义的宏,我没有找到关于 C++ 是否保证支持它的参考。

更好的解决方案是使用std::numeric_limits< float >::is_iec559std::numeric_limits< double >::is_iec559

C++11 18.2.1.1 类模板 numeric_limits

静态 const bool is_iec559 ;

52 当且仅当类型符合 IEC 559 标准时为真。210)

53 对所有浮点类型都有意义。

在脚注中:

210) 国际电工委员会标准 559 与 IEEE 754 相同。

关于你的第二个假设,我认为你不能说任何字节顺序都是“标准的”,但如果机器之间的字节顺序是相同的(小端或大端),那么是的,我认为你可以这样序列化。

于 2013-07-22T05:57:00.823 回答
1

考虑像 XDR [用于 Unix RPC] 或 CDR 等标准序列化怎么样?

http://en.wikipedia.org/wiki/External_Data_Representation

例如: bool_t xdr_float(XDR *xdrs, float *fp); 来自 linux.die.net/man/3/xdr

或 C++ 库 http://xstream.sourceforge.net/

您可能还对 CDR [CORBA 使用] 感兴趣,ACE [自适应通信环境] 有 CDR 类 [但它的库非常重]

于 2013-07-22T05:27:05.093 回答