<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java整數(shù)相加溢出怎么辦?Java 8 還是厲害!

          共 1133字,需瀏覽 3分鐘

           ·

          2020-11-08 03:33

          作者:Aaron_濤

          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)該修改一下,理解判斷思路,因為異常是十分耗時的操作,無腦異常有可能超時。

          推薦閱讀


          代碼對比工具,我就用這6個

          分享我常用的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)注

          瀏覽 63
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91麻豆一区| 国产福利91精品 | 国产美女做爱A片是免费 | 国产午夜一区二区 | 国产综合在线观看视频国产 |