从双位到无符号64位整数的安全转换

use*_*947 6 c c++

在我的平台上打印9223372036854775808.

double x = 1e19;
std::cout << static_cast<unsigned __int64>(x) << '\n';
Run Code Online (Sandbox Code Playgroud)

我尝试了Boost.NumericConversion,但得到了相同的结果.

x分成2个相等的部分,然后将转换后的一半加在一起得到正确的结果.但我需要在模板代码中使用通用解决方案.

先感谢您.

编辑:此问题出现在Visual Studio 2008上,但不是MinGW.将4.0e9转换为unsigned long工作正常.

Igo*_*Oks 10

似乎它适用于gcc,但它在Visual Studio中存在问题.请参阅Microsoft有关此问题的答案:

我们的浮点到整数转换总是对有符号整数进行.在这种特殊情况下,我们使用FIST指令生成800..00,如您所述.因此,没有定义的行为转换为大于最大64位有符号整数的无符号64位整数值.

因此,您只能转换带符号的64位整数范围内的数字:-9,223,372,036,854,775,808到+9,223,372,036,854,775,807(-2 ^ 63~2 ^ 63-1).