vc ++无法将unsigned long long的差异转换为double

时间:2018-01-11 07:00:21

标签: c++ visual-c++

以下vc ++ 2017中的代码:

#include <iostream>
int main(){
    unsigned long long i = 0, j = 1;

    double d = i - j;
    cout << d << endl;
}

结果为1.84467e+19

这是一个错误吗?

my vc ++ 2017:Version 15.1(26403.7)

2 个答案:

答案 0 :(得分:0)

/ticket2243/asd返回18446744073709551615,所以VS是正确的。

您可能希望在std::numeric_limits<unsigned long long>::max()之前移除unsigned

来自here

  

无符号整数运算总是以2 n 模2执行   其中n是该特定整数中的位数。例如。对于   unsigned int,在UINT_MAX中加1,得0,减1   从0开始给出UINT_MAX。

答案 1 :(得分:0)

不,这不是错误。尝试转向一种心态,在绝大多数情况下,问题不在于编译器。

i - j0 - 1,其评估为-1 类型为 unsigned long long(因为两个参数均为unsigned long long类型)。< / p>

这被定义为std::numeric_limits<unsigned long long>::max()

当将其转换为double(在该平台上由IEEE754标准化)时,您将获得一些精度损失(您正在将需要64位的内容转换为具有52位尾数的类型):结果将是正确的约15个十进制有效数字,从而占你的输出。