Java中如何检测int类型整数乘法运算的溢出错误
Java整数幂次计算溢出检测方案
方案1:手动前置溢出判断(兼容所有Java版本,无需异常处理)
每次执行乘法前做前置校验:如果当前result > Integer.MAX_VALUE / base,那么result * base必然超出32位int的取值范围,直接触发溢出提示即可。
int base = 10, power = 10, result = 1; boolean overflow = false; for (int i = 1; i <= power; i++) { // 提前判断乘法后是否会溢出 if (result > Integer.MAX_VALUE / base) { overflow = true; break; } result *= base; } if (overflow) { System.out.println("result数据类型为32位int,不得超过2,147,483,647"); } else { System.out.println(base + " to the power of " + power + " result: " + result); }
方案2:使用Java 8+内置精确乘法方法(代码更简洁)
java.lang.Math提供的multiplyExact方法执行int乘法时如果发生溢出会主动抛出ArithmeticException,捕获该异常即可处理溢出场景。
int base = 10, power = 10, result = 1; try { for (int i = 1; i <= power; i++) { result = Math.multiplyExact(result, base); } System.out.println(base + " to the power of " + power + " result: " + result); } catch (ArithmeticException e) { System.out.println("result数据类型为32位int,不得超过2,147,483,647"); }
方案3:用long存储中间结果,最终校验(实现最简单)
如果计算的幂次不会超过long的取值范围,直接用64位long存储计算过程的结果,最后判断是否超出int最大值即可:
int base = 10, power = 10; long result = 1; for (int i = 1; i <= power; i++) { result *= base; } if (result > Integer.MAX_VALUE) { System.out.println("result数据类型为32位int,不得超过2,147,483,647"); } else { System.out.println(base + " to the power of " + power + " result: " + (int)result); }
内容的提问来源于stack exchange,提问作者Hakan ÖZHAN
相关产品推荐
相关产品推荐

