如何在没有未定义的行为的情况下修改float/double的位?

0 c++ undefined-behavior

我想设置/清除浮点数并在C++中加倍并打印出结果.我肯定会long long bits = *(long long*)&doubleVar;调用未定义的行为.我不确定是否将它放入工会也是正确的.如何在C++中获取/设置float和double的位而不会导致未定义的行为?

dou*_*oug 5

为了避免未定义的行为,您需要使用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);
Run Code Online (Sandbox Code Playgroud)

将它放在一个单独的命名空间中是个好主意,这样你就不会在C++ 20中出现冲突.您可以随意修改任何内容并将其转换回来.