C-如何存储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?可以用double和float来做吗?如果是这样的话,我如何保证它们在每个平台上都是8和4字节长?

首先,您不能执行指针强制转换破解。绝对不能保证字节缓冲区正确对齐。这导致未定义的行为。改为使用memcpy

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

我应该放什么来代替IEE745double_tIEEE745single_t?可以用double和float来做吗?

是的,有可能,如果

  • double是8个字节,float是4个字节,并且两者都使用IEEE754表示
  • buffer上的数据使用与主机相同的字节顺序。如果没有,则需要首先复制到临时无符号整数类型,在那里修复endianness

如果是这样的话,我如何保证它们在每个平台上都是8和4字节长?

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

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

最新更新