Java 两个大整数相乘时需要强制转换吗?

Java 两个大整数相乘时需要强制转换吗?,java,Java,假设你有两个大整数,你想把它们相乘 int a = 150000; int b = 200000; Operation 1: [Incorrect] ( Overflows ) long result = a * b; Operation 2: [Correct] long result = (long)a*b; 为什么即使赋值给可以容纳结果的类型的变量,也需要强制转换?是的,需要强制转换 如果未将一个或两个int参数强制转换为long,则乘法将作为32位操作执行。如果乘法溢出,最终

假设你有两个大整数,你想把它们相乘

int a = 150000;
int b = 200000;

Operation 1: [Incorrect] ( Overflows )    
long result = a * b;
Operation 2: [Correct]
long result = (long)a*b;

为什么即使赋值给可以容纳结果的类型的变量,也需要强制转换?

是的,需要强制转换

如果未将一个或两个
int
参数强制转换为
long
,则乘法将作为32位操作执行。如果乘法溢出,最终分配给
结果的值将不正确

正如JLS所述():

如果整数乘法溢出,则结果是数学乘积的低阶位,如某些足够大的2的补码格式所示。因此,如果发生溢出,则结果的符号可能与两个操作数值的数学乘积的符号不同

如果将一个或两个操作数强制转换为
long
,则乘法将作为64位运算执行,并且运算不会溢出


(还有其他方法可以使用
long
算法执行操作,但类型转换是最常用的方法。)

是的,需要转换

如果未将一个或两个
int
参数强制转换为
long
,则乘法将作为32位操作执行。如果乘法溢出,最终分配给
结果的值将不正确

正如JLS所述():

如果整数乘法溢出,则结果是数学乘积的低阶位,如某些足够大的2的补码格式所示。因此,如果发生溢出,则结果的符号可能与两个操作数值的数学乘积的符号不同

如果将一个或两个操作数强制转换为
long
,则乘法将作为64位运算执行,并且运算不会溢出


(还有其他方法可以使用
long
算法执行操作,但类型转换是最惯用的方法。)

我认为这是因为顺序。第一次乘法第二次赋值


干杯。

我想是因为顺序。第一次乘法第二次赋值


干杯。

这是因为在你的例子中,a和b是整数,你需要先将它们转换为长(强制转换),否则会产生冲突。因为long可以容纳您的结果,因为它比简单的int数据类型有更多的位(即64位)

这是因为在您的例子中,a和b是整数,您需要首先将它们转换为long(强制转换),否则会产生冲突。因为long可以容纳您的结果,因为它比简单的int数据类型有更多的位(即64位)

进行任何算术运算时,必须知道运算符的优先级。赋值运算符的优先级最低,因此首先计算结果,然后将其赋值给给定变量,因此在计算时,JAVA会分配具有最高字节存储的变量类型的内存字节。例如

  • int*int计算结果将存储在int中
  • int*float计算结果将存储在float中
  • float*double计算结果将存储在double中
  • int*float*double计算结果将存储在double中

因此,在您的示例中,计算结果将存储在int中,然后只进行赋值。

当您执行任何算术运算时,您必须知道运算符的优先级。赋值运算符的优先级最低,因此首先计算结果,然后将其赋值给给定变量,因此在计算时,JAVA会分配具有最高字节存储的变量类型的内存字节。例如

  • int*int计算结果将存储在int中
  • int*float计算结果将存储在float中
  • float*double计算结果将存储在double中
  • int*float*double计算结果将存储在double中

因此,在您的示例中,计算结果将存储为int,然后只进行赋值。

在您的示例中,首先将
a
转换为
long
,然后执行乘法

您可以更新操作,以确保这将导致像这样的长结果
long result=1L*a*b
,操作的数值结果将是长的,因为它在开始时使用长(当然要注意操作员优先级)

但这行不通

long result = a * b * 1L
因为整数乘法将首先完成并存储在整数中


有关优先级的解释,请参见我的答案。在您的案例中,首先将
a
转换为
long
,然后执行乘法

您可以更新操作,以确保这将导致像这样的长结果
long result=1L*a*b
,操作的数值结果将是长的,因为它在开始时使用长(当然要注意操作员优先级)

但这行不通

long result = a * b * 1L
因为整数乘法将首先完成并存储在整数中


有关优先级的解释,请参见我的答案。

java中int类型的范围是–2147483648到2147483647,我们得到的结果是300000000000不能被int保留这么长时间。

java中int类型的范围是–2147483648到2147483647,我们得到的结果是300000000000不能被int保留这么长时间必需。

因为Java将首先乘以值,然后分配值。它看起来不像指定的类型,因为隐式转换发生在乘法之后。如果将两个
int
s相乘,结果将溢出
int
,然后将其转换为
long
,因为Java将首先将值相乘,然后分配值。看起来不像