Запись / Чтение С удваивается в формате обмена IEEE 754 - PullRequest
3 голосов
/ 23 апреля 2010

Итак, я сериализую структуру данных C для кроссплатформенного использования и хочу убедиться, что записываю числа с плавающей запятой в кросс-платформенном режиме.

Я планировал просто сделать

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

Но я не был уверен, что байты будут записаны в массиве char * в формате обмена IEEE 754. Я был укушен кросс-платформенными проблемами раньше (endian-ness и прочее). Что мне нужно сделать для double, чтобы получить байты в формате обмена?

1 Ответ

2 голосов
/ 24 апреля 2010
Реализации

C вовсе не обязаны использовать представление IEEE 754, поэтому любое решение, основанное на прямом доступе к двоичному представлению double, в любом случае не будет действительно переносимым.

Если , вы предполагаете, что собираетесь работать только с системами, которые представляют двойные числа в формате IEEE 754, и единственное беспокойство - это порядковый номер (и вы предполагаете, что последовательность байтов с прямым порядком байтов) в отличие от последовательности байтов с прямым порядком байтов - единственные варианты!) ... тогда вы, возможно, можете проверить бесконечность во время выполнения, используя некоторое значение с известным двоичным представлением (так же, как вы можете проверить целое число, посмотрев на посмотрите, был ли 0x12345678 сохранен с 0x12 или 0x78 в качестве первого байта).

(Если вы действительно обеспокоены переносимостью, я не уверен, что есть какой-либо лучший вариант, чем использование sprintf() и strtod(), и я предполагаю, что вам не обязательно иметь больше точности чем абсолютный минимум, требуемый соответствующей спецификацией, например, раздел 5.2.4.2.2 спецификации C99)

...