我必须使用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
?有可能用双倍和漂浮吗?如果是这样,我怎么能保证每个平台上它们的长度为8和4个字节?
答案 0 :(得分:3)
首先,你不能做指针投射黑客。绝对不能保证您的字节缓冲区正确对齐。这会导致未定义的行为。请改用memcpy
:
memcpy(&first8bytes, &buffer[8], 8);
memcpy(&next4bytes, &buffer[16], 4);
我应该放什么而不是
IEE745double_t
和IEEE745single_t
?有可能用double和float吗?
是的,可以,如果:
double
为8个字节,float
为4个字节,均使用IEEE754表示。buffer
上的数据使用与主机相同的字节顺序。如果没有,则需要先复制到临时无符号整数类型,然后修复字节序。如果是这样,我怎么能保证每个平台上的长度为8和4个字节?
使用静态断言来检测它何时不是。例如:
static_assert(sizeof(float) == 4, "invalid float size");