Если я проверю свой код со следующим:
#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));
…безопасно сериализовать float для записи в файл или сетевой пакет?
Если нет, то как я могу безопасно сериализовать поплавки и дубли?
Кроме того, кто отвечает за порядок байтов — мой код или операционную систему?
Чтобы прояснить мой вопрос: могу ли я приводить числа с плавающей запятой к 4 байтам и удваивать к 8 байтам, и безопасно сериализовывать файлы и файлы или между сетями, если я:
__STDC_IEC_559__
это макрос, определенный C99 / C11, я не нашел ссылки на то, гарантирует ли C ++ его поддержку.
Лучшее решение — использовать std::numeric_limits< float >::is_iec559
или же std::numeric_limits< double >::is_iec559
C ++ 11 18.2.1.1 Шаблон класса numeric_limits
static const bool is_iec559;
52 Истинно, если и только если тип соответствует стандарту IEC 559.210)
53 Имеет значение для всех типов с плавающей запятой.
В сноске:
210) Стандарт 559 Международной электротехнической комиссии соответствует стандарту IEEE 754.
Что касается вашего второго предположения, я не думаю, что вы можете сказать, что какой-либо порядок байтов является «стандартным», но если порядок байтов одинаков между машинами (с прямым или младшим порядком байтов), то да, я думаю, что вы можете сериализовать таким образом.
Как насчет стандартной сериализации, такой как 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
или библиотека с ++
http://xstream.sourceforge.net/
Вы также можете быть включены в CDR [используется CORBA], ACE [адаптивная коммуникационная среда] имеет классы CDR [но его очень тяжелая библиотека]