美文网首页
Math.addExact 是如何判断溢出的

Math.addExact 是如何判断溢出的

作者: 王灵 | 来源:发表于2020-05-15 20:07 被阅读0次

知识点

1、二进制符号位

在二进制码中,为了区分正负数,采用最高位是符号位的方法来区分,正数的符号位为0、负数的符号位为1.剩下的就是这个数的绝对值部分,

2、& ~ | ^ 运算符

  • & 与运算符;两个操作数中位都为1,结果才为1,否则结果为0
  • 非运算符;如果位为0,结果是1,如果位为1,结果是0
  • | 或运算符;两个位只要有一个为1,那么结果就是1,否则就为0
  • ^异或运算符;两个操作数的位中,相同则结果为0,不同则结果为1

3、算术溢出

在定点计算机中,从正方向超过了数的表示范围,称为上溢;从负方向超过了数的表示范围,则称为下溢
上溢会得到一个最大的负数,下溢获得到一个最大的正数;

分析

算术溢出只可能发生在两个正数的和是负数,或者两个负数的和是正数;

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)) < 0
->((x ^ r) & (y ^ r)) < 0的符号位是1
->(x ^ r)(y ^ r)的符号位都是1
->xr的符号位不同 ; yr的符号位不同
->xy的符号位是相同的,且与r的符号位不同
->两个符号位相同的数相加却得到了一个符号位不同的和
->溢出了

相关文章

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

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

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

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

  • 如何判断在哪里内存溢出

    1、先判断是否是内存溢出导致的 监控内存的情况 将内存调整为500M,可以看到程序在运行一段时间后,老生代的内存一...

  • 7. Reverse Integer

    algorithm 判断整数乘法会不会溢出:

  • 2018-11-26 缓冲区溢出漏洞学习记录

    如何发现漏洞 :• 源码审计• 逆向工程• 模糊测试• 向程序堆栈半随机的数据,根据内存变化判断溢出• 数据生成器...

  • leetcode 8

    首先解决空格接着解决符号然后判断数字,解决非法输入判断溢出

  • 判断整型运算是否溢出

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

  • 位数组

    如何判断一个数字是否在海量的数字中出现? 常规做法是把海量数字存放到HashMap中,但这会造成内存溢出。位数组就...

  • 判断整形是否溢出

    转载 int add(int x, int y, int *overflow) { int z = x + y; ...

  • Java判断整数溢出

    开题报告第一版写完发给老师了,熬了两周终于搞出来了,等着被怼了之后再改吧。晚上选了Leetcode一道简单的题,整...

网友评论

      本文标题:Math.addExact 是如何判断溢出的

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