我正在尝试学习数字如何存储在计算机内存中的基本知识。因此我最近选择了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
。
答案 0 :(得分:5)
您在此处签署了整数溢出,这是未定义的行为。你说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
更改为双倍,这也将解决问题。