在C ++中我想得到double myval = 1.3;
它的位是0x3FF4CCCCCCCCCCCC但是如何在不破坏别名规则和做未定义行为的情况下获得它?
答案 0 :(得分:4)
您可以逐字节将这些位复制到整数对象中。允许使用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是大端,则需要使用偏移量进行复制。