我正在尝试学习数字如何在计算机内存中存储的基本知识。因此,我最近拿起了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 * 65535
4294836225
因此会溢出结果。
解决此问题的唯一方法是使用可以保存结果的更宽/更大的类型。 例如,如果你乘以两个long long
,你可以做65535 * 65535
就可以了。
只要乘法中至少有一个变量的类型足够大以存储结果,那么你就可以了。 所以在这种情况下,两者
val * static_cast<double>(val)
和
val * static_cast<long long>(val)
会给你正确的结果。 您也可以将val
更改为双精度,这也将解决问题。