我必须使用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_t
和IEEE745single_t
?可以用double和float来做吗?如果是这样的话,我如何保证它们在每个平台上都是8和4字节长?
首先,您不能执行指针强制转换破解。绝对不能保证字节缓冲区正确对齐。这导致未定义的行为。改为使用memcpy
:
memcpy(&first8bytes, &buffer[8], 8);
memcpy(&next4bytes, &buffer[16], 4);
我应该放什么来代替
IEE745double_t
和IEEE745single_t
?可以用double和float来做吗?
是的,有可能,如果:
double
是8个字节,float
是4个字节,并且两者都使用IEEE754表示buffer
上的数据使用与主机相同的字节顺序。如果没有,则需要首先复制到临时无符号整数类型,在那里修复endianness
如果是这样的话,我如何保证它们在每个平台上都是8和4字节长?
使用静态断言来检测何时不是。例如:
static_assert(sizeof(float) == 4, "invalid float size");