C - 如何存储IEEE 754双精度和单精度

时间:2016-03-30 13:29:48

标签: c floating-point format ieee-754

我必须使用IEEE 745双精度和单精度数字。 我不知道如何正确使用它们。

我有二进制数据的缓冲区,我想获得像

这样的数字
uint8_t bufer[] = {................};
//data I want are at 8th position, (IEEE745_t is my imaginary format)
IEEE745double_t first8bytes = *(IEEE745double_t*)(buffer + 8);
IEEE745single_t next4bytes = *(IEEE745single_t*)(buffer + 16);

我应该放什么而不是IEE745double_tIEEE745single_t?有可能用双倍和漂浮吗?如果是这样,我怎么能保证每个平台上它们的长度为8和4个字节?

1 个答案:

答案 0 :(得分:3)

首先,你不能做指针投射黑客。绝对不能保证您的字节缓冲区正确对齐。这会导致未定义的行为。请改用memcpy

memcpy(&first8bytes, &buffer[8], 8); 
memcpy(&next4bytes, &buffer[16], 4); 
  

我应该放什么而不是IEE745double_tIEEE745single_t?有可能用double和float吗?

是的,可以,如果

  • double为8个字节,float为4个字节,均使用IEEE754表示。
  • buffer上的数据使用与主机相同的字节顺序。如果没有,则需要先复制到临时无符号整数类型,然后修复字节序。
  

如果是这样,我怎么能保证每个平台上的长度为8和4个字节?

使用静态断言来检测它何时不是。例如:

static_assert(sizeof(float) == 4, "invalid float size");