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

标签 c++ undefined-behavior

我想在 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/

相关文章:

c - 为什么这些构造使用前后递增的未定义行为?

c++ - 为什么 CMAKE 找不到这些变量?

c++ - 使用带有 cin 的 getline 指定用户输入

c++ - 为什么有些程序以未定义的行为执行而其他程序却没有?

c++ - 是否为get_time定义了重复赋值?

c++ - put_money 是按值还是按引用保存其参数?

c++ - 替换 C++ 指针字符串中的字符?

c++ - 将 0 和 1 发送到 USB 数据引脚?

c++ - 架构 x86_64 的 undefined symbol : OS X, Boost Log,CMake

c++ - 为什么 STL 数据结构需要完全定义的类型