以下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)
答案 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 - j
为0 - 1
,其评估为-1
类型为 unsigned long long
(因为两个参数均为unsigned long long
类型)。< / p>
这被定义为std::numeric_limits<unsigned long long>::max()
。
当将其转换为double
(在该平台上由IEEE754标准化)时,您将获得一些精度损失(您正在将需要64位的内容转换为具有52位尾数的类型):结果将是正确的约15个十进制有效数字,从而占你的输出。