我有一个unsigned long long
(或uint64_t
)值并想将其转换为double
. 双精度应具有与该值相同的位模式long
。这样我可以“手动”设置双精度位。
unsigned long long bits = 1ULL;
double result = /* some magic here */ bits;
我正在寻找一种方法来做到这一点。
我有一个unsigned long long
(或uint64_t
)值并想将其转换为double
. 双精度应具有与该值相同的位模式long
。这样我可以“手动”设置双精度位。
unsigned long long bits = 1ULL;
double result = /* some magic here */ bits;
我正在寻找一种方法来做到这一点。
执行此操作的可移植方法是使用memcpy
(您也可以有条件地使用reinterpret_cast
或联合执行此操作,但它们不一定是可移植的,因为它们违反了严格别名规则的字母):
// First, static assert that the sizes are the same
memcpy(&result, &bits, sizeof(bits));
但在你做之前确保你确切地知道你在做什么以及正在使用什么浮点表示(尽管 IEEE754 是一个流行/常见的选择)。您需要避免各种问题值,例如无穷大、NaN 和非正规数。
注意union
和reinterpret_cast<double*>(&bits)
,因为这两种方法都是 UB。几乎所有你能做的就是 memcpy。
以下使用 void 指针。
unsigned long long bits = 1ULL;
void* tempPtr=(void*)&bits;
double result = *(double*)tempPtr;