以前类似的问题,没有回答我的问题:
bit cast uint64_t to double and back in a macro
Converting uint64_t to Double Value的
我需要保存一个double
到一个STM32L476微控制器上的闪存中。闪存控制器以64位块工作,ST的HAL API接受一个uint64_t
参数用于写入数据。为此,我需要将double变量的位转换为一个或多个uint64_t
。
我尝试了以下方法,这是UB:
uint64_t flash_write_val = *(uint64_t*)&double_value;
字符串
然而,我得到了一个编译器警告,说我违反了严格的别名规则。如果不调用UB,我该怎么做呢?它不需要是超级可移植的。它只在Cortex M4F内核上有效。
我在想:
union uint64_double {
uint64_t flash_friendly;
double math_friendly;
};
型
这是个好办法吗,还是我在搬起石头砸自己的脚?
3条答案
按热度按时间wfsdck301#
只需使用
memcpy
将字节复制到您想要的位置。字符串
zaqlnxep2#
以下是我使用的代码:用途:
字符串
如果你在类中使用它,不要忘记将它声明为static。奇怪的是,GCC并没有在constexpr表达式中抱怨memcpy(可能编译器优化了它)。注意:没有必要声明第二个类型:
型
wdebmtf23#
这是唯一的Cortex-M3+答案!!
1.指针一语双关。
字符串
由于Cortex-M3和更新版本支持非对齐访问,因此上述操作是100%安全的。我个人更喜欢
memcpy
方式,但在FLASH写函数中,我通常使用指针双关。1.联合双关语-安全、便携:
型
memcpy
函数最具可移植性,可能也是最有效的方法,因为现代编译器非常清楚memcpy
的功能,在许多情况下,它是内联的。的字符串
https://godbolt.org/z/Ws6Yr15x8