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

时间:2017-10-28 19:04:56

标签: c++

在C ++中我想得到double myval = 1.3;它的位是0x3FF4CCCCCCCCCCCC但是如何在不破坏别名规则和做未定义行为的情况下获得它?

1 个答案:

答案 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是大端,则需要使用偏移量进行复制。