为什么双精度不存储两个整数的乘积

Why double is not storing the product of two int

本文关键字:整数 两个 双精度 存储 为什么      更新时间:2023-10-16

我正在尝试学习数字如何在计算机内存中存储的基本知识。因此,我最近拿起了C++。我写了下面的函数,来计算任何整数值的平方。

// 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.

您在此处已签名整数溢出,这是未定义的行为。 你说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更改为双精度,这也将解决问题。