Java如何判斷整數(shù)溢出,溢出后怎么得到提示?
作者:Aaron_濤
blog.csdn.net/qq_33330687/article/details/81626157
問(wèn)題
在之前刷題的時(shí)候遇見(jiàn)一個(gè)問(wèn)題,需要解決int相加后怎么判斷是否溢出,如果溢出就返回Integer.MAX_VALUE
解決方案
JDK8已經(jīng)幫我們實(shí)現(xiàn)了Math下,不得不說(shuō)這個(gè)方法是在StackOverflow找到了的,確實(shí)比國(guó)內(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)該修改一下,理解判斷思路,因?yàn)楫惓J鞘趾臅r(shí)的操作,無(wú)腦異常有可能超時(shí)
寫(xiě)這個(gè)的目的
總結(jié)一下,也方便告訴他人Java幫我們寫(xiě)好了函數(shù)。
加微信回復(fù)"cloud?& vue"即可獲取
SpringCloud+Vue(Mybatis)框架與搭建視頻播放站視頻教程
評(píng)論
圖片
表情
