<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ù)溢出,溢出后怎么得到提示?

          共 4741字,需瀏覽 10分鐘

           ·

          2021-03-05 23:52

          點擊上方 好好學(xué)java ,選擇 星標 公眾號

          重磅資訊,干貨,第一時間送達

          今日推薦:寫博客能月入 10K?

          個人原創(chuàng)100W +訪問量博客:點擊前往,查看更多


          作者:Aaron_濤

          blog.csdn.net/qq_33330687/article/details/81626157

          問題

          在之前刷題的時候遇見一個問題,需要解決int相加后怎么判斷是否溢出,如果溢出就返回Integer.MAX_VALUE

          解決方案

          JDK8已經(jīng)幫我們實現(xiàn)了Math下,不得不說這個方法是在StackOverflow找到了的,確實比國內(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)該修改一下,理解判斷思路,因為異常是十分耗時的操作,無腦異常有可能超時

          寫這個的目的

          總結(jié)一下,也方便告訴他人Java幫我們寫好了函數(shù)。

          推薦文章
          更多項目源碼

          瀏覽 89
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  靠逼视频免费在线观看 | 九九热最新视频 | 中文丰满亲子伦 | 亚洲黄片大全 | 日韩色情在线观看 |