Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java整数相加溢出怎么办?Java 8 还是厉害!

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

作者头像
JAVA葵花宝典
发布于 2020-11-13 03:35:36
发布于 2020-11-13 03:35:36
71200
代码可运行
举报
文章被收录于专栏:JAVA葵花宝典JAVA葵花宝典
运行总次数:0
代码可运行

作者:Aaron_涛

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

问题

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

解决方案

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

加法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
}

减法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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;
}

乘法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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是不一样的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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;
}

如何使用?

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JAVA葵花宝典 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java安全编码指南之:Number操作
java中可以被称为Number的有byte,short,int,long,float,double和char,我们在使用这些Nubmer的过程中,需要注意些什么内容呢?一起来看看吧。
程序那些事
2020/09/14
6730
java安全编码指南之:Number操作
Strings, Numbers, Math 21-30
本文为《Java Coding Problems》21-30题,问题涉及String, Number和Math (共39题)。
luoheng
2022/09/04
3040
Java 核心工具类 API 详解(一):从 Math 到 Runtime 的实用指南
我们发现这样效率太慢了,于是我们发现一个数的因子在平方根的左边,于是我们可以从左边遍历,这样可以节省时间
钮祜禄.爱因斯晨
2025/07/20
780
Java 核心工具类 API 详解(一):从 Math 到 Runtime 的实用指南
LeetCode - 整数反转
原题地址:https://leetcode-cn.com/problems/reverse-integer/
晓痴
2019/09/24
3490
LeetCode - 整数反转
Strings, Numbers, Math 31-39
本文为《Java Coding Problems》31-39题,问题涉及String, Number和Math (共39题)。
luoheng
2022/09/04
3310
007. 整数反转 | Leetcode题解
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为[−231, 231− 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
苏南
2020/12/16
4410
007. 整数反转 | Leetcode题解
Leetcode 题目解析之 Divide Two Integers
Divide two integers without using multiplication, division and mod operator.
ruochen
2022/01/15
1.3K0
Java Integer 类 解读
Integer 类是Java中最常用的类型,它是原生类型 int 的包装类。在开发中我们基本可以将两者等价。但是,最近在开发中遇到一个 == 与 equals 不一致的错误。所以趁此机会深入了解一下java中的Integer类。
yuxiaofei93
2018/09/11
8350
Leetcode 题目解析之 Fraction to Recurring Decimal
Given two integers representing the numerator and denominator of a fraction, return the fraction in string format.
ruochen
2022/01/15
1.2K0
第十一届蓝桥杯决赛JavaC组真题——详细答案对照(完整版)
  小蓝特别喜欢 2 ,今年是公元 2020 年,他特别高兴。   他很好奇,在公元 1 年到公元 2020 年(包含)中,有多少个年份的数位中包含数字 2 ?
红目香薰
2022/11/29
8200
第十一届蓝桥杯决赛JavaC组真题——详细答案对照(完整版)
leetcode-29. 两数相除
  根据题目的要求,我们先判断被除数是否为 0,若为 0 直接返回结果。由于 Integer.MIN_VALUE/-1 会导致溢出,因此价格判断,若遇到这种情况,则直接返回 Integer.MAX_VALUE。   设置一个正负标志位,假设为 true 则为负数。巧妙用被除数和除数的异或来与 0 比较,其实这个就单纯判断是否异号,跟异或本身运算结果没多大意义,这里选择异或运算符还是挺可以的。接下来将两个数强转为 long 型并取绝对值,为了防止溢出,用 long 类型来接收,再定义存储最终结果的变量。   接下来是一个 for 循环,几行代码,但是信息量挺大,功能很强,我赞叹这几行代码现在,一个字就是绝!这里是逆向思维:先把被除数左移 i 位,i 的值从 31 开始递减,当 被除数/2^i 的值刚好出现大于等于除数的时候,说明这时候要求的商已经出现,并且大于除数的部分就是余数。   这时候,2^i 就是商,但是此时循环要怎么退出来呢,比较好的方法就是控制被除数 d 的值,就是将除数 r 左移 i 位,然后被除数减去此时左移完数值跟被除数相近的除数的值,目的是用 d -= r << i 这个式子让 if 的条件 (d >> i) >= r 不满足,因为被除数 d 被减后的值再右移 i 位后肯定小于除数的(篇幅有限可自行证明,不难),for 也就执行到 i < 0 时成功退出。最后再根据上边 flag 的正负情况用三目表达式返回结果即可。非常巧妙,做题愉快!
灰太狼学Java
2022/10/27
8130
leetcode-29. 两数相除
挑战程序竞赛系列(92):3.6凸包(3)
该文是关于解决一个几何问题,该问题的目标是确定一个凸多边形的最大内角。该文使用了一种称为“动态规划”的技术,该技术涉及使用子问题来解决问题。该文还介绍了一种称为“凸包”的数据结构,该数据结构用于表示凸多边形。
用户1147447
2018/01/02
6630
挑战程序竞赛系列(92):3.6凸包(3)
【leetcode 29】 两数相除(中等)
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
用户10384376
2023/02/26
4810
【leetcode 29】 两数相除(中等)
通过java.util.concurrent.TimeUnit来学习枚举
今天无意间看到了java.util.concurrent.TimeUnit枚举类。
明明如月学长
2021/08/31
5340
通过java.util.concurrent.TimeUnit来学习枚举
整数反转(ReverseInteger)
注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [, ]。请根据这个假设,如果反转后整数溢出那么就返回 0。
爱敲代码的猫
2019/12/18
5150
Java Integer源码解读
1、引言 public class IntegerDemo { public static void main(String[] args){ Integer i=10;
程裕强
2018/01/02
9120
Java Integer源码解读
【Java】基础篇-包装类
上回说到了 字符类型 char, 作为基本类型之一, char 的底层实现对于 string 等有的关键的决定因素. 至于基本类型,难点不多,我们不在叙述了,这次我们讲 另一种类型 --- 封装类型
haoming1100
2019/04/18
6250
java四舍五入成整数的方法
在java的Math类中,提供了许许多多的和数学计算有关的方法,其中也包括取整的,关于取整的有向下取整的floor(double d)返回值double,rint(double d),round(double d)和round(float f)。
全栈程序员站长
2022/08/31
1.6K0
java四舍五入成整数的方法
Java 编程问题:一、字符串、数字和数学
本章包括 39 个涉及字符串、数字和数学运算的问题。我们将从研究字符串的一系列经典问题开始,例如计算重复项、反转字符串和删除空格。然后,我们将研究专门用于数字和数学运算的问题,例如两个大数求和和和运算溢出,比较两个无符号数,以及计算除法和模的下限。每个问题都要经过几个解决方案,包括 Java8 的函数风格。此外,我们将讨论与 JDK9、10、11 和 12 有关的问题。
ApacheCN_飞龙
2022/07/11
9600
Stack Overflow 最火的一段代码竟然有 Bug...
于是,我看到了下面这个问题:怎样将字节数输出成人类可读的格式?也就是说,怎样将123,456,789字节输出成123.5MB?
Java技术栈
2021/08/12
1K0
Stack Overflow 最火的一段代码竟然有 Bug...
相关推荐
java安全编码指南之:Number操作
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验