如何在 C 中的uint64_t变量中存储浮点值?

How to store float value in uint64_t variable in C?

提问人:Роман 提问时间:11/15/2022 最后编辑:wohlstadРоман 更新时间:11/15/2022 访问量:241

问:

我有一个值数组,我需要在其中存储 4 种不同的数据类型: ,, , .我通过简单的强制转换为 来解决每种类型,但它不适用于浮点数:uint64_tuint64_t *data;intchar*boolfloat(uint64_t)

float val = 1.5f;
uint64_t var = (uint64_t) val;
printf("%.1f", (float) var); // prints 1.0

有没有办法在比强制转换更低的级别上在变量之间移动数据?我尝试以各种方式组合演员表,但结果是或.0.01.0

C 铸造 浮点

评论

0赞 Jeeter 11/15/2022
您可以尝试将其转换为指针,这样您就不会影响基础值。即uint64_t *var = (uint64_t *) &val;
5赞 Andrew Henle 11/15/2022
我需要存储 4 种不同数据类型的地方你为什么“需要”这样做?这尖叫着“糟糕的设计乞求调用未定义的行为”。使用适当的 、 或足够大的数组和 。unioncharmemcpy()
0赞 Andrew Henle 11/15/2022
@Jeeter 而这正是我刚才提到的未定义的行为......
2赞 Some programmer dude 11/15/2022
首先:整数和浮点值在内存中的编码完全不同。通过强制转换,您可以进行从值到值的转换。这将截断小数点,只留下整数部分。它不是按位复制。与将强制转换回浮点数类似,它不是任何类型的按位复制。(uint64_t) valfloatuint64_t

答:

2赞 chux - Reinstate Monica #1

...将值存储在变量中...floatuint64_t

复制它。

float var_f = 1.5f;
uint64_t var_u64;
_Static_assert(sizeof var_f <= sizeof var_u64, "Wide float");
memcpy(&var_u64, &var_f, sizeof var_f);

恢复

memcpy(&var_f, &var_u64, sizeof var_f);
printf("%g\n", var_f);

评论

3赞 Some programmer dude 11/15/2022
最好知道,在大多数系统(当然是当前所有类似 PC 的系统)上都是单精度 32 位类型。这样使用是可行的,但它会使一半的变量处于不确定状态(确切地说,哪一半取决于系统的字节序)。floatmemcpyuint64_t