为什么double不存储两个int的乘积

时间:2018-02-21 17:38:48

标签: c++

我正在尝试学习数字如何存储在计算机内存中的基本知识。因此我最近选择了C ++。我编写了以下函数来计算任何int值的平方。

 // since integer can go upto 65K value, hence the return
 // value is double to accomodate the square of highest int value.
 double square(int val) {
     return val*val;
 }

为什么它给我65535的错误答案,根据我的理解,这是可以存储在int类型变量中的最大数字?我还发现有类似的东西:

std::numeric_limits<int>::max()

给了我2147483647。这反过来让我更加困惑,但我正在寻找解释为什么我的square功能失败。

修改

对于65535我的g++编译器给了我:-131071

1 个答案:

答案 0 :(得分:5)

您在此处签署了整数溢出,这是未定义的行为。你说std::numeric_limits<int>::max()给出2147483647,因为65535小于你认为你应该没问题。问题是你不是。当您一起乘以int时,结果将存储在int中(即使这不是您指定的内容)。由于65535 * 655354294836225,因此会溢出结果。

解决这个问题的唯一方法是使用更宽/更大的类型来保存结果。例如,如果你将两个long long相乘,你可以65535 * 65535并且没问题。

只要乘法中的至少一个变量类型足以存储结果,那么你就可以了。所以在这种情况下都是

val * static_cast<double>(val)

val * static_cast<long long>(val)

会给你正确的结果。您也可以将val更改为双倍,这也将解决问题。