两个大整数相乘是否需要强制转换?

2024-04-22

假设您有两个大整数并且您想要将它们相乘。

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 位运算执行。如果乘法溢出,则最终分配的值result将会是不正确的。

正如 JLS 所说(15.7.1 http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.17.1):

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

如果任一操作数是long,乘法将作为64位运算执行,并且运算不会溢出。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两个大整数相乘是否需要强制转换? 的相关文章

随机推荐