专栏首页upuptop的专栏Java整数相加溢出怎么办?Java 8 还是厉害!

Java整数相加溢出怎么办?Java 8 还是厉害!

作者:Aaron_涛

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

问题

在之前刷题的时候遇见一个问题,需要解决int相加后怎么判断是否溢出,如果溢出就返回Integer.MAX_VALUE

解决方案

JDK8已经帮我们实现了Math下,不得不说这个方法是在StackOverflow找到了的,确实比国内一些论坛好多了

加法

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;
}

如何使用?

直接调用是最方便的,但是为了追求速度,应该修改一下,理解判断思路,因为异常是十分耗时的操作,无脑异常有可能超时。

由于微信公众号近期改变了推送规则,如果你想如常看到我们的文章,可以时常点击文末右下角的「在看」;或者将 趣学程序 星标。 这样操作后,我们每次新的推送才能第一时间出现在你的订阅列表中~

本文分享自微信公众号 - 趣学程序(quxuecx),作者:点击关注 ????

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-11-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java整数相加溢出怎么办?Java 8 还是厉害!

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

    JAVA葵花宝典
  • StackOverflow热帖:Java整数相加溢出怎么办?Java8一步搞定~

    来源:blog.csdn.net/qq_33330687/article/details/81626157

    良月柒
  • 2015年Java开发岗位面试题归类

    3. 说说你知道的几个Java集合类:list、set、queue、map实现类咯。。。

    哲洛不闹
  • 月薪20K的Java程序员很厉害?八年程序猿却说:我被裁只用了5分钟

    之前,一位在我交流群里的群友找我诉苦:工作8年,从事Java开发相关的工作6年,最近(18年7月)失业快4个月,还是没有找到合适的工作。

    Java架构
  • Java基础巩固计划

    3.26-4.1 JVM 虚拟机的内容写五篇博客 解决以下问题: 1. Java的内存模型以及GC算法 2. jvm性能调优都做了什么 3. 介绍JVM中7个区...

    Janti
  • StackOverflow热帖:Java整数相加重叠怎么办?Java8一步搞定〜

    在之前刷题的时候遇见一个问题,需要解决int相加后如何判断是否重叠,如果重叠就返回Integer.MAX_VALUE

    会呼吸的Coder
  • Java后端面试题大汇总,冲刺金三银四

    3. 说说你知道的几个Java集合类:list、set、queue、map实现类咯。。。

    程序员白楠楠
  • 蘑菇街大三Java后端暑期实习面经

    17、线程的几个状态,block和wait状态有什么区别?什么情况下会block和wait

    Guide哥
  • 《Java从入门到失业》第三章:基础语法及基本程序结构(3.7):运算符(基本算数运算符、原码、反码、补码)

          数学运算是计算机的基本用途之一,Java提供了非常丰富的运算符来支持。我们根据运算的特点和性质,把运算符划分为几组:基本算数运算符、自增自减运算符、...

    用户7801119
  • 211渣硕,海投200+家Java岗(面40,过7),收获多份offer!

    Java架构技术
  • 一周播报|WePhone创始人苏享茂之死:程序员是否该逃离代码的象牙塔?

    养码人B:加缓冲队列,异步存db。如果数据不大,直接先存交互,不要和db直接交互。全部的都放在内存,数据库定时写就行,但是注册的同时,还需要其他数据写入,所以如...

    养码场
  • 年末将至,值得你关注的16个Java 开源项目!

    Guide 哥我自己大三开始维护的,目前算是纯 Java 类型项目中 Star 数量最多的项目了。但是,本仓库的价值远远(+N次 )比不上像 Spring Bo...

    Guide哥
  • Java程序员拿阿里、京东、腾讯的offer指南

    我开始投递简历(世界那么大,我想去外面的世界看看)。这次看机会与往常不同,我决定好好准备一番,然后开始投递简历,主要渠道是 “X钩”,辅助渠道是猎头。

    java架构师
  • 一周播报|东厂小情报:同为P6,阿里资深与蚂蚁高级工程师的差别竟然是这样……

    1、“养码场·一周技术职位清单”改版成“养码场·职位优选”。图片上的每个职位,都是场主为养码人精心挑选的,带有各自极其亮眼的标签福利。

    养码场
  • Java中的substring真的会引起内存泄露么?

    在Java中开发,String是我们开发程序可以说必须要使用的类型,String有一个substring方法用来截取字符串,我们想必也常常使用。但是你知道么,关...

    技术小黑屋
  • 面试复习大纲(最全面)

    Java基础 1.数组中的排序问题(笔试或者机试,前者可能性更大) 2.面向对象的理解 面向对象主要有四个特性: 封装、抽象、继承和多态。 封装:在面向对象语言...

    Java帮帮
  • 没吃透Netty底层通讯原理,还能算得上Java老司机?

    搞了N年Java,仍有不少朋友困惑:用了很多年Dubbo,觉得自己挺厉害,跳槽面试时一问RPC,一问底层通讯,一问NIO和AIO,就一脸懵逼,到底该怎么办?

    Java团长
  • 211渣硕,海投200+Java岗,面50家侥幸过了7家!!!

      211渣硕,电气专业转JAVA后台,看书很少多数是在刷面经,能找到工作实属侥幸,现献上自己的面经,希望能帮助到别人

    秃顶的Java程序员
  • 【Java】基础篇-HashMap

    public V put(K key, V value) { // 对key的hashCode()做hash return putVal(ha...

    haoming1100

扫码关注云+社区

领取腾讯云代金券