美文网首页Java 杂谈
Math.addExact如何解决加法溢出问题

Math.addExact如何解决加法溢出问题

作者: Jacquie葭葵 | 来源:发表于2019-02-20 22:07 被阅读3次

基于源码的个人理解 如有误解请指正

Java中直接用运算符进行加法操作,会产生溢出:

int a = Integer.MAX_VALUE;
int b = 1;
int c = a+b;
System.out.println(c-Integer.MIN_VALUE);
//output:0

​ 说明a+b产生了溢出,且值等于绝对值最大的负数,负2的31次方。

​ 为了解决这个问题,Math类提供了一个不会溢出的加法:

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

​ 原理其实很简单。只有两个正数或者两个负数相加的时候才会溢出,一正一负是不会溢出的。并且,溢出后得到的结果一定是与原值的符号相反的。

​ 借用这个原理,(x ^ r) & (y ^ r)将用运算符算出来的r与x和y分别异或。异或的规则是同0异1。我们只看符号位,如果符号位不同,那么两个括号得到的都是1。而与运算又是只有1 & 1才是1,有一个为0都是0。因此,一旦溢出,无论是正溢出负溢出,(x ^ r) & (y ^ r)计算出的结果都应该小于0

如果有用麻烦点个喜欢,对我是莫大的鼓励。

相关文章

  • Math.addExact如何解决加法溢出问题

    基于源码的个人理解 如有误解请指正 Java中直接用运算符进行加法操作,会产生溢出: ​ 说明a+b产生了溢出...

  • Math.addExact 是如何判断溢出的

    知识点 1、二进制符号位 在二进制码中,为了区分正负数,采用最高位是符号位的方法来区分,正数的符号位为0、负数的符...

  • 少即是多(第四周教学总结)

    文/ 梁树丽 我们习惯用加法来解决问题,而用加法解决问题的结果就是解决问题的办法又会产生新的问题,所以我们的生活变...

  • Lecture 4

    2.2 定点加法、减法运算 2.2.1 补码加法 2.2.2 补码减法 2.2.3 溢出概念与检测方法 2.3 定...

  • 解决富文本编辑器图片大小溢出

    如何解决富文本编辑器图片大小溢出?只需要简单的定义:img{max-width: 100%;}即可解决问题

  • swift 运算符

    溢出运算符 溢出加法&+ 溢出减法&- 溢出乘法&* 对于无符号与有符号整型数值来说,当出现上溢时,它们会从数值所...

  • 2019-04-25 关于css的一些需要记载的内

    关于一个段落文字溢出问题----转化成...如何用css解决: 在vue中如何动态添加css样式 设置一个开关fl...

  • 判断整型运算是否溢出

    加法溢出: 无符号整数溢出判断较简单 有符号整数溢出的时候只存在正溢出和负溢出两种情况,即两正数相加得到一个负数或...

  • 知识迁移

    远迁移与近迁移 解决相似的问题 比如数学代数,会用整数加法,则可以相似整数的加法问题 如果遇到意外情况该怎么办...

  • 公司项目总结(2018-10-23)

    1.日期:10.10问题:测试服务出现堆栈溢出问题?解决:递归函数没有出口,函数被重复调用,时间长必将引起堆栈溢出...

网友评论

    本文标题:Math.addExact如何解决加法溢出问题

    本文链接:https://www.haomeiwen.com/subject/ozikyqtx.html