java 溢出if_如何检查Java中的两个数字相乘是否会导致溢出?

问题

我想处理两个数字相乘导致溢出的特殊情况。代码看起来像这样:

int a = 20;

long b = 30;

// if a or b are big enough, this result will silently overflow

long c = a * b;

这是一个简化版本。在真正的程序a和b中,在运行时从其他地方获取。我想要实现的是这样的:

long c;

if (a * b will overflow) {

c = Long.MAX_VALUE;

} else {

c = a * b;

}

你如何建议我最好编码?

更新:a和b在我的方案中始终是非负的。

#1 热门回答(74 赞)

Java 8 hasMath.multiplyExact,Math.addExactetc。对于整数和长期。这些抛出一个未经检查的ArithmeticException溢出。

#2 热门回答(55 赞)

如果a和b都是正数,那么你可以使用:

if (a != 0 && b > Long.MAX_VALUE / a) {

// Overflow

}

如果你需要处理正数和负数,那么它就更复杂了:

long maximum = Long.signum(a) == Long.signum(b) ? Long.MAX_VALUE : Long.MIN_VALUE;

if (a != 0 && (b > 0 && b > maximum / a ||

b < 0 && b < maximum / a))

{

// Overflow

}

这是一个小桌子我掀起来检查这个,假装溢出发生在-10或10:

a = 5 b = 2 2 > 10 / 5

a = 2 b = 5 5 > 10 / 2

a = -5 b = 2 2 > -10 / -5

a = -2 b = 5 5 > -10 / -2

a = 5 b = -2 -2 < -10 / 5

a = 2 b = -5 -5 < -10 / 2

a = -5 b = -2 -2 < 10 / -5

a = -2 b = -5 -5 < 10 / -2

#3 热门回答(17 赞)

有些Java库提供安全的算术运算,可检查长溢出/下溢。例如,Guava'sLongMath.checkedMultiply(long a, long b)返回a和b的产品,前提是它没有溢出,并且在signedlong算术中抛出ArithmeticExceptionifa * boverflows。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值