我想在 C++ 中设置/清除 float 和 double 的位并打印出结果。我肯定 long long bits = *(long long*)&doubleVar;
会调用未定义的行为。我也不确定将它放在 union 中是否正确。如何在 C++ 中获取/设置 float 和 double 的位而不导致未定义的行为?
最佳答案
要避免未定义的行为,您需要使用 memcpy()
一个简单的方法是使用建议的模板 std::bit_cast<to_type>(from_type from)
您可以在 https://en.cppreference.com/w/cpp/numeric/bit_cast 中获取包装此操作的模板(仅提议)并且使用简单:
double pun_me=3.0;
std::uint64_t ui64=my_namespace::bit_cast<uint64_t>(pun_me);
将它放在一个单独的命名空间中是个好主意,这样当/如果它出现在 C++20 中时就不会发生冲突。然后,您可以随意修改任何内容并将其转换回来。
关于c++ - 如何在没有未定义行为的情况下修改 float/double 的位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51778042/