乘法时输出错误。这是我的编译器中的错误吗? C ++

时间:2018-03-27 07:18:50

标签: c++

当我写这篇文章时:

cout << 10000 * 10000;

我得到了这个输出:

100000000

但是当我尝试时:

cout << 100000 * 100000;

我明白了:

1410065408

这怎么可能?为什么?

3 个答案:

答案 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;
  

百亿
  141006540​​8个
  141006540​​8个
  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定义它肯定会得到正确的答案。