如何在 C++ 中获得没有 UB 的浮点位表示?
How to get float bit representation without UB in C++?
据我所知,所有 'traditional' 方法都可以做到这一点,即 reinterpret_cast
指针和 union
以及 int
和 float
字段UB 是否违反了严格的别名 (in C++, not in C)。
那么,如何在没有未定义行为的情况下正确地做到这一点呢?
我可以做一个 reinterpret_cast
到 char *
然后 memcpy 到 uint32_t 吗?或者也许std::launder
会有帮助?
正如 Jason Turner 所指出的那样,标准方法是使用 memcpy
:
float f = 1.0;
std::byte c[sizeof(f)];
memcpy(c, &f, sizeof(f));
您可能认为您不想复制任何内容,只想查看 bits/bytes。好吧,编译器很聪明,他们实际上会像 Jason 所展示的那样优化它,所以不要担心,对这种事情使用 memcpy
而永远不要 reinterpret_cast
.
据我所知,所有 'traditional' 方法都可以做到这一点,即 reinterpret_cast
指针和 union
以及 int
和 float
字段UB 是否违反了严格的别名 (in C++, not in C)。
那么,如何在没有未定义行为的情况下正确地做到这一点呢?
我可以做一个 reinterpret_cast
到 char *
然后 memcpy 到 uint32_t 吗?或者也许std::launder
会有帮助?
正如 Jason Turner 所指出的那样,标准方法是使用 memcpy
:
float f = 1.0;
std::byte c[sizeof(f)];
memcpy(c, &f, sizeof(f));
您可能认为您不想复制任何内容,只想查看 bits/bytes。好吧,编译器很聪明,他们实际上会像 Jason 所展示的那样优化它,所以不要担心,对这种事情使用 memcpy
而永远不要 reinterpret_cast
.