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

Raj*_*ena 0 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;
 }
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑

因为65535我的g++编译器给了我:-131071.

Nat*_*ica 5

您在这里签署了整数溢出,这是未定义的行为.你说std::numeric_limits<int>::max()给予2147483647,从那65535 以后,你觉得你应该没事.问题是你不是.当您将它们相乘int时,结果将存储在a中int(即使这不是您指定的内容).既然65535 * 655354294836225溢出的结果.

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

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

val * static_cast<double>(val)
Run Code Online (Sandbox Code Playgroud)

val * static_cast<long long>(val)
Run Code Online (Sandbox Code Playgroud)

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