【发布时间】:2018-02-21 17:38:48
【问题描述】:
我正在尝试了解数字如何存储在计算机内存中的基本知识。因此,我最近开始学习 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。
【问题讨论】:
-
存储在 int 中的最大值实际上取决于您的编译器和 int 的字节数,如果您有一个 unsigned int,即 2 个字节(16 位),那么 65535 将是最大的价值。在这种情况下,一个 int 似乎是有符号的,并且是 4 个字节。
-
16 位
int不能容纳 65535 作为最大值。最大的将是 32767,因为int已签名。如果您的字是 16 位,您可能希望unsigned int的最大值为 65535。还是您的int32 位?从你的问题不清楚。另外,当您说错误答案时,您看到哪些答案是您认为错误的?这篇文章总体上很不清楚。 -
您对
int的最大大小做出了错误的假设。它可能因平台/编译器而异。 C++ 标准为您提供的所有内容都是有保证的最小 大小。 -
有关最小整数大小的信息,请参阅 cppreference.com - Integer types。
-
除非你转换为
double在乘法之前,你仍然在执行有符号整数乘法,在溢出的情况下其行为是不确定的。您只是将最终结果投射到double,这没有帮助。
标签: c++