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