You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cortex M4F下如何合法将double按位转换为uint64_t用于STM32闪存写入

方案合理性说明

你提出的共用体方案在Cortex-M4F平台上完全可用,无额外隐患:

  • C语言标准明确允许通过共用体实现类型双关,只要两个成员的内存大小、对齐要求匹配即可。Cortex-M4F上double为标准IEEE 754双精度浮点数,正好占64位,和uint64_t的大小、对齐要求完全一致,不会出现截断或者错位问题。
  • STM32常用的Arm GCC、Arm Compiler编译链都明确支持该用法,不会触发严格别名相关的警告或错误优化。

其他可选的无UB方案

如果需要更严谨的写法,还有两种完全无UB的实现可选,效率和共用体方案完全一致,编译后都会生成等效的单条数据搬运指令,无额外开销:

  1. 通用memcpy方案(C/C++全版本兼容)
uint64_t flash_write_val;
memcpy(&flash_write_val, &double_value, sizeof(double));

该写法完全规避别名规则限制,所有编译器都能正确处理。
2. C20标准方案
如果你的项目使用C
20及以上标准,可以直接调用标准库函数:

uint64_t flash_write_val = std::bit_cast<uint64_t>(double_value);

这是C++标准明确规定的合法位转换接口,语义更清晰。

最初的指针强制转换为什么是UB

你最开始写的*(uint64_t*)&double_value违反了C/C++的严格别名规则,编译器允许假设不同类型的指针不会指向同一块内存空间,可能会做出不符合预期的优化,因此会触发警告,实际运行也有概率出问题,不建议使用。


内容的提问来源于stack exchange,提问作者Louis Cloete

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:45:01