代码之家  ›  专栏  ›  技术社区  ›  user401947

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

c c++
  •  6
  • user401947  · 技术社区  · 15 年前

    在我的平台上打印9223372036854775808。

    double x = 1e19;
    std::cout << static_cast<unsigned __int64>(x) << '\n';
    

    分裂 分成两等份,然后将换算后的两半相加得到正确的结果。但我需要一个通用的解决方案,在模板代码中使用。

    先谢谢你。

    编辑: 这个问题在visualstudio2008上出现,但在MinGW上没有。将4.0e9转换为未签名的长工作。

    2 回复  |  直到 15 年前
        1
  •  13
  •   BenMorel Manish Pradhan    11 年前

    Microsoft's answer

    我们的浮点到整数 转换总是对一个 如果我们使用FIST指令 生成800..00,如您所述。 转换为无符号的行为 64位整数值 大于最大的64位有符号

        2
  •  3
  •   Jens Gustedt    15 年前

    编译器的行为不符合C99,它要求在可能的情况下始终正确转换正值。它只允许偏离负值。

    当整数类型的值为 当真值 浮点类型转换为无符号类型

    对于模板代码,可以只测试值是否大于 static_cast< double >(UINT64_MAX/2)