Java整數(shù)相加溢出怎么辦?Java 8 還是厲害!
blog.csdn.net/qq_33330687/article/details/81626157
問題
在之前刷題的時候遇見一個問題,需要解決int相加后怎么判斷是否溢出,如果溢出就返回Integer.MAX_VALUE
解決方案
JDK8已經(jīng)幫我們實(shí)現(xiàn)了Math下,不得不說這個方法是在StackOverflow找到了的,確實(shí)比國內(nèi)一些論壇好多了
加法
public?static?int?addExact(int?x,?int?y)?{
????????int?r?=?x?+?y;
????????//?HD?2-12?Overflow?iff?both?arguments?have?the?opposite?sign?of?the?result
????????if?(((x?^?r)?&?(y?^?r))?0)?{
????????????throw?new?ArithmeticException("integer?overflow");
????????}
????????return?r;
}
減法
?public?static?int?subtractExact(int?x,?int?y)?{
????????int?r?=?x?-?y;
????????//?HD?2-12?Overflow?iff?the?arguments?have?different?signs?and
????????//?the?sign?of?the?result?is?different?than?the?sign?of?x
????????if?(((x?^?y)?&?(x?^?r))?0)?{
????????????throw?new?ArithmeticException("integer?overflow");
????????}
????????return?r;
}
乘法
public?static?int?multiplyExact(int?x,?int?y)?{
????????long?r?=?(long)x?*?(long)y;
????????if?((int)r?!=?r)?{
????????????throw?new?ArithmeticException("integer?overflow");
????????}
????????return?(int)r;
}
注意 long和int是不一樣的
??public?static?long?multiplyExact(long?x,?long?y)?{
????????long?r?=?x?*?y;
????????long?ax?=?Math.abs(x);
????????long?ay?=?Math.abs(y);
????????if?(((ax?|?ay)?>>>?31?!=?0))?{
????????????//?Some?bits?greater?than?2^31?that?might?cause?overflow
????????????//?Check?the?result?using?the?divide?operator
????????????//?and?check?for?the?special?case?of?Long.MIN_VALUE?*?-1
???????????if?(((y?!=?0)?&&?(r?/?y?!=?x))?||
???????????????(x?==?Long.MIN_VALUE?&&?y?==?-1))?{
????????????????throw?new?ArithmeticException("long?overflow");
????????????}
????????}
????????return?r;
}
如何使用?
直接調(diào)用是最方便的,但是為了追求速度,應(yīng)該修改一下,理解判斷思路,因為異常是十分耗時的操作,無腦異常有可能超時。
推薦閱讀
分享我常用的5個免費(fèi)的在線 SQL 數(shù)據(jù)庫環(huán)境,簡直太方便了!
Spring Boot 三招組合拳,手把手教你打出優(yōu)雅的后端接口
MySQL 5.7 vs 8.0,你選那個?網(wǎng)友:我繼續(xù)原地踏步~
最后,推薦給大家一個有趣有料的公眾號:寫代碼的渣渣鵬,7年老程序員教你寫bug,回復(fù) 面試|資源 送一你整套開發(fā)筆記 有驚喜哦
掃碼關(guān)注
評論
圖片
表情

