c++ - 如何在不执行未定义行为的情况下获得浮点/双位?

标签 c++

在 C++ 中,我想获取 double myval = 1.3; 的位,它是 0x3FF4CCCCCCCCCCCC 但是我如何在不违反别名规则和执行未定义行为的情况下获取它?

最佳答案

您可以将位逐字节复制到整数对象中。允许使用 char 别名。然后您可以移动并屏蔽该整数的位以获取各个位的值。

逐字节复制的最简单方法是std::memcpy。您需要确保您的整数类型足够大。

double myval = 1.3;
unsigned long long myval_int = 0;
static_assert(sizeof myval_int == sizeof myval);
std::memcpy(&myval_int, &myval, sizeof myval);
std::cout << std::hex << myval_int;

为了更好地确保您拥有适当大小的整数类型,请参阅 http://www.boost.org/doc/libs/1_65_1/libs/integer/doc/html/boost_integer/integer.html

请注意,复制到整数的开头仅在整数具有相同大小时有效 - 或者如果整数更大,则 CPU 必须是小端。如果整数较大,并且 CPU 是大端,则需要使用偏移量进行复制。

关于c++ - 如何在不执行未定义行为的情况下获得浮点/双位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46993411/

相关文章:

c++ - 两个进程可以通过 ptrace 附加到同一个 PID

C++ 析构函数奇怪的行为

try 中变量的 C++ 作用域

c++ - 在rapidjson中解析数组内的对象

c++ - numeric_limits 是最小/最大常数吗?

c++ - 段错误发生在某些编译器中,但其他编译器没有

c++ - 隐藏规则——参数/返回类型必须相同吗?

c++ - Qt读取多张图片优化——如何只读取大小?

c++ - 我可以隐式刷新数据吗?

c++ - std::launder alternative pre c++17