是否有一种定义良好且性能良好的方式来按位将 double 转换为 uint64_t 并返回

以前的类似问题没有回答我的问题:

位转换 uint64_t 在宏中加倍并返回

将 uint64_t 转换为双精度值

我需要将 a 保存double到 STM32L476 微控制器上的闪存中。闪存控制器在 64 位块中工作,来自 ST 的 HAL API 使用uint64_t参数来写入数据。为此,我需要将 double 变量中的位转换为一个或多个uint64_ts。

我尝试了以下,这是 UB:

uint64_t flash_write_val = *(uint64_t*)&double_value;

但是,我收到有关违反严格别名规则的编译器警告。如果不调用 UB,我将如何做到这一点?它不需要超级便携。它只能在 Cortex M4F 内核上有效。

我在想这个:

union uint64_double {
    uint64_t flash_friendly;
    double math_friendly;
};

这是一个好方法,还是我还在用脚射击?

回答

只是memcpy用来复制你想要的字节。

memcpy(&flash_write_val, &double_val, sizeof(double_val));
  • 这是正确答案。虽然我可能会建议在某处添加 `static_assert(sizeof(double)==sizeof(uint64_t), "oops");` 以用于防御目的。

以上是是否有一种定义良好且性能良好的方式来按位将 double 转换为 uint64_t 并返回的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>