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

C++ 为什么double不存储两个int的乘积,c++,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; } 为什么它给了我一个关

我正在努力学习数字如何存储在计算机内存中的基本知识。因此,我最近已经学会了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\u limits::max()

这给了我
2147483647
。这反过来又让我更加困惑,但我正在寻找我的
square
函数失败的原因

编辑


对于
65535
我的
g++
编译器给了我:
-131071

这里有符号整数溢出,这是未定义的行为。你说
std::numeric_limits::max()
给出了
2147483647
,因为
65535
比你觉得应该没问题。问题是你不是。当您同时乘以
int
时,结果存储在
int
中(即使这不是您分配给它的值)。由于
65535*65535
4294836225
它会溢出结果

解决这个问题的唯一方法是使用一个更宽/更大的类型来保存结果。例如,如果您将两个
long
相乘,您就可以执行
65535*65535
,并且一切正常

只要乘法中至少有一个变量的类型足够大,可以存储结果,就可以了。所以在这种情况下

val * static_cast<double>(val)
val*静态强制转换(val)

val*静态强制转换(val)

会给你正确的结果。您还可以将
val
更改为双精度,这也将解决问题。

您在这里有符号整数溢出,这是一种未定义的行为。你说
std::numeric_limits::max()
给出了
2147483647
,因为
65535
比你觉得应该没问题。问题是你不是。当您同时乘以
int
时,结果存储在
int
中(即使这不是您分配给它的值)。由于
65535*65535
4294836225
它会溢出结果

解决这个问题的唯一方法是使用一个更宽/更大的类型来保存结果。例如,如果您将两个
long
相乘,您就可以执行
65535*65535
,并且一切正常

只要乘法中至少有一个变量的类型足够大,可以存储结果,就可以了。所以在这种情况下

val * static_cast<double>(val)
val*静态强制转换(val)

val*静态强制转换(val)

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

int中存储的最大值实际上取决于编译器,int的字节数是多少,如果您有一个无符号int,即2个字节(16位),那么65535将是最大值。在这种情况下,整数似乎是有符号的,有4个字节。16位的
int
不能将65535作为最大值。最大的是32767,因为
int
是有符号的。如果您的字是16位,则需要将无符号int设置为65535最大值。还是您的
int
32位?你的问题不清楚。还有,当你说,错误的答案时,你到底看到了哪些你认为是错误的答案?这篇文章总体上很不清楚。你对
int
的最大大小的假设是错误的。它可能因平台/编译器而异。所有C++标准都保证了最小的大小。参见最小整数大小的信息。除非在乘法之前将其转换为<代码>双< /代码>,否则仍在执行有符号整数乘法,其行为在溢出时未定义。您只是将最终结果强制转换为
double
,这是没有帮助的。int中存储的最大值实际上取决于您的编译器,并且int的字节数是,如果您有一个无符号int,即2个字节(16位),那么65535将是最大值。在这种情况下,整数似乎是有符号的,有4个字节。16位的
int
不能将65535作为最大值。最大的是32767,因为
int
是有符号的。如果您的字是16位,则需要将无符号int设置为65535最大值。还是您的
int
32位?你的问题不清楚。还有,当你说,错误的答案时,你到底看到了哪些你认为是错误的答案?这篇文章总体上很不清楚。你对
int
的最大大小的假设是错误的。它可能因平台/编译器而异。所有C++标准都保证了最小的大小。参见最小整数大小的信息。除非在乘法之前将其转换为<代码>双< /代码>,否则仍在执行有符号整数乘法,其行为在溢出时未定义。您只是将最终结果强制转换为
double
,这是没有帮助的。或者,由于所需的最终结果是
double
,我相信
val*(double)val
就足够了,可以对浮点类型的不精确性进行模化。“唯一的方法”?@bolov还有什么方法可以在不使用较大数据类型的情况下存储较大的值?我使用了
double
来包含
65535*65535
的输出。我对C++的了解非常有限。@ RajatSaxena,在这种情况下,我相信我对这个问题的评论可能是你所要寻找的。你只是简单地使用
double
太晚了。或者,由于期望的最终结果是
double
,我相信
val*(double)val
就足够了,对浮点类型的不精确性进行模化。“唯一的方法”?@bolov你还能做什么