Java中int与long类型乘法溢出问题求助
问题分析与解决办法
问题根源
你遇到的是整数溢出问题,核心原因是运算顺序导致的类型截断:
int类型的取值范围是-2147483648到2147483647,而123456789 × 987654321的结果远超出这个范围。- 代码中
n1*n2是两个int类型的运算,结果会先被当作int处理,溢出后产生错误的负数,再赋值给long变量时,这个错误值不会被修正。
解决方案
1. 提前转换类型避免溢出
在乘法运算前,将任意一个int操作数强制转换为long,这样整个运算会以long类型执行(long的范围足够容纳该乘积):
int n1 = 123456789; int n2 = 987654321; long ans = (long)n1 * n2;
或者直接将变量声明为long类型,从根源上避免溢出:
long n1 = 123456789; long n2 = 987654321; long ans = n1 * n2;
2. 超大整数用BigInteger处理
如果后续需要处理更大的整数(超出long的范围,long最大值为9223372036854775807),可以使用Java的BigInteger类,它支持任意精度的整数运算:
import java.math.BigInteger; public class Main { public static void main(String[] args) { BigInteger n1 = new BigInteger("123456789"); BigInteger n2 = new BigInteger("987654321"); BigInteger ans = n1.multiply(n2); System.out.println(ans); // 输出正确结果121932631112635269 } }
内容的提问来源于stack exchange,提问作者Smarani Basu
相关产品推荐
相关产品推荐

