当我写这篇文章时:
cout << 10000 * 10000;
我得到了这个输出:
100000000
但是当我尝试时:
cout << 100000 * 100000;
我明白了:
1410065408
这怎么可能?为什么?
答案 0 :(得分:4)
两个操作数的类型都是整数,因此结果类型也是int。您可以运行以下程序来查看正在进行的操作
cout << 100000LL * 100000LL << endl;
cout << 100000 * 100000 << endl;
cout << 100000LL * 100000LL % (numeric_limits<unsigned int>::max()+1LL) << endl; // +1 accounts for zero
cout << typeid(100000 * 100000).name() << endl;
百亿
1410065408个
1410065408个
INT
注意,添加LL
可以解决问题。
答案 1 :(得分:0)
乘法的操作数是整数类型。由于您还没有在操作数上提供后缀,因此编译器会尝试将它们强制转换为int
,如果失败,则为long int
。使用C ++ 11,它还会尝试强制转换为long long int
。因此,在C ++ 11之前,您的程序行为可能在此时未定义,但是对于C ++ 11,两个操作数都可以表示为long long int
,因为必须至少为64位
所以问题要么是因为你的系统没有足够大的整数类型来表示该产品(可能在编译时进行评估)。所以你的程序行为是未定义的。
如果你将其中一个参数提升为浮点数,那么输出将处于浮点状态,尽管相关的精度损失(通常约为15个有效数字)。
请查看std::numeric_limits
了解详情。
答案 2 :(得分:-1)
它提供了一个垃圾值,因为超过了整数类型限制。 最简单的方法是使用double和square定义它肯定会得到正确的答案。