Integer溢出问题

0. 背景

在刷 LeetCode 时,代码的执行结果与预期出现了偏差,原因是 Int 值超过了允许范围 [ − 2 31 , 2 31 − 1 ] [-2^{31},2^{31}-1 ] [231,2311]。工作中从来没有遇到过这种情况,之前的认知是如果 Int 中存储的值超过了允许范围也许代码会报错,又或者会自动截断。但是真实的结果却与预期的不同,Java 不但没有报错,也没有对 Int 值进行截断,而是 Int 值直接从一个边界跳转到另一个边界。

//Int最大值 + 1 = Int最小值
Integer.MAX_VALUE + 1 = Integer.MIN_VALUE;
//Int最小值 -1 = Int最大值
Integer.MIN_VALUE - 1 = Integer.MAX_VALUE;

同时出现的另一个问题是,对 Integer.MIN_VALUE 使用 Math.abs 方法会失效,取出的绝对值居然还是负数,数值没有发生变化。

1. Integer 如何处理溢出的数据

Integer 的运算并不是使用十进制进行的,而是使用二进制补码进行的。 Integer 在 Java 中的定义是 4 个字节,1 个字节是 8 位,所以上限是 32 位( [ − 2 31 , 2 31 − 1 ] [-2^{31},2^{31}-1 ] [231,2311])。当 Integer 在运算过程中超出了 32 位,计算机会对改变量进行截断,将超出的部分(新增的最高位)进行舍弃。

//Int 最小值 -1 = Int 最大值
Integer. MIN_VALUE - 1 = Integer. MAX_VALUE;

根据 Integer 对溢出情况的处理,对上述代码进行验算,验算过程如下,-1 相当于加上 -1。补码运算时符号位也是参与运算的。在这里插入图片描述

2. 如何避免程序悄悄的发生 Integer 溢出

在程序运行中最可怕的不是程序报错,而是没有任何异常的情况下得到与预期不相符的结果。

使用 Math.addExactMath.subtractExact 方法代替 +-Math.addExactMath.subtractExact 方法会在出现溢出时抛出异常如下。

Exception in thread "xxxx" java.lang.ArithmeticException: integer overflow
at java.base/java.lang.Math.addExact(Math.java:911)

可以通过对异常的处理捕获或处理让技术团队知道出现了 Integer 溢出。

3. 为什么 Math.absInteger.MIN_VALUE 无效

Math.abs 的源码如下,只是简单的对负数做了一个 - 操作,类似 * -1

public static int abs(int a) {  return (a < 0) ? -a : a;  
}

二进制中的相反数是对该数字安位取反(含符号位)后+1。而通过计算得出 Integer.MIN_VALUE 的相反数等于它的本身,所以 Math.absInteger.MIN_VALUE 无效,计算过程如下。
在这里插入图片描述

原码—补码转换的计算过程可以参考这篇文档——原码、反码和补码。
二进制相反数的原理可以参考这篇文档——二进制相反数。

参考资料

JAVA 整数溢出问题
Java如何判断整数溢出,溢出后怎么得到提示
关于int的范围以及溢出问题
反码和补码的数学原理
由 Math.abs 谈负数转换与绝对值运算

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/27549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【FreeRTOS】ARM架构汇编实例

目录 ARM架构简明教程1. ARM架构电脑的组成1.2 RISC1.2 提出问题1.3 CPU内部寄存器1.4 汇编指令 2. C函数的反汇编 学习视频 【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS&#xff08;FreeRTOS教程 基于STM32&#xff0c;以实际项目为导向&#xff09;】 https://www.…

Unity制作背包的格子

1.新建一个面板 2.点击面板并添加这个组件 3.点击UI创建一个原始图像&#xff0c;这样我们就会发现图像出现在了面板的左上角。 4.多复制几个并改变 Grid Layout Group的参数就可以实现下面的效果了

LeetCode题练习与总结:单词接龙--127

一、题目描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk&#xff1a; 每一对相邻的单词只差一个字母。 对于 1 < i < k 时&#xff0c;每个 si 都在 wordList 中。注意&am…

GraogGNSSLib学习

GraogGNSSLib学习 程序编译环境版本项目编译结果问题 程序编译 GraphGNSSLib 环境版本 程序开源是在ubuntu16.04-kinetic环境跑通的&#xff0c;但是我的环境是UBUNTU20.04&#xff0c;所以&#xff0c;先进行了ROS的安装&#xff0c;因为我的系统是ubuntu20.04所以&#xf…

如何优化Flask-Report报表的性能和加载速度

如何优化Flask-Report报表的性能和加载速度 在开发Web应用时&#xff0c;报表生成是一个常见的需求。Flask-Report是一个强大的Flask扩展&#xff0c;可以帮助我们快速生成PDF报表。然而&#xff0c;随着数据量的增加和复杂性的提高&#xff0c;报表的生成速度和性能可能会受到…

Linux--MQTT(一)简介

一、简介 MQTT &#xff08; Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输&#xff09;&#xff0c; 是一种基于客户端服务端架构的发布/订阅模式的消息传输协议。 与 HTTP 协议一样&#xff0c; MQTT 协议也是应用层协议&#xff0c;工作在 TCP/IP 四…

k8s环境里查看containerd创建的容器对应的netns

如何查看containerd创建的容器对应的netns 要查看由 containerd 创建的容器对应的网络命名空间&#xff08;netns&#xff09;&#xff0c;你可以遵循以下步骤。这个过程涉及到了解容器的 ID&#xff0c;以及使用 ctr 命令或其他方式来检索容器的详细信息。这里假定你已经具备…

MOS开关电路应用于降低静态功耗

本文主要讲述MOS开关电路的应用,过了好久突然想整理一下&#xff0c;有错误的地方请多多指出&#xff0c;在做电池类产品&#xff0c;需要控制产品的静态功耗&#xff0c;即使让芯片进入休眠状态&#xff0c;依旧功率很大&#xff0c;所以在电路中加一组软开关&#xff0c;防止…

HTML静态网页成品作业(HTML+CSS)—— 零食商城网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

LeetCode 230.二叉搜索树中第K小的元素

各位看官们&#xff0c;大家好啊&#xff0c;今天这个题我用的方法时间复杂度比较高&#xff0c;但也是便于便于理解的一种方法&#xff0c;大家如果觉得的好的话&#xff0c;就给个免费的赞吧,谢谢大家了^ _ ^ 题目要求如图所示: 题目步骤&#xff1a; 1.我们可以一维数组来接…

使用Unsloth微调Llama3-Chinese-8B-Instruct中文开源大模型

微调Llama3-Chinese-8B-Instruct 微调是指在大规模预训练的基础模型上,使用特定领域或任务数据集进行少量迭代训练,以调整模型参数,提升其在特定任务上的表现。这种方法可以充分利用预训练模型的广泛知识,同时针对特定应用进行优化,达到更精准高效的效果。 Llama-3-Chinese-8B-…

刷题记录(240613)

aliyun0512 1. 小红定义一个数组是好数组&#xff0c;当且仅当所有奇数出现了奇数次&#xff0c;所有偶数出现了偶数次。现在小红拿到了一个数组&#xff0c;她希望取一个该数组的非空子序列(可以不连续)&#xff0c;使得子序列是好数组。你能帮小红求出子序列的方案数吗?由于…

【超详细】使用RedissonClient实现Redis分布式锁

使用RedissonClient实现Redis分布式锁是一个非常简洁和高效的方式。Redisson是一个基于Redis的Java客户端&#xff0c;它提供了许多高级功能&#xff0c;包括分布式锁、分布式集合、分布式映射等&#xff0c;简化了分布式系统中的并发控制。 添加依赖 首先&#xff0c;你需要…

mysql社区版有可以双机吗

MySQL社区版确实支持双机配置&#xff0c;以实现数据的冗余、备份和负载均衡等功能。以下是关于MySQL双机配置的一些关键点和步骤&#xff1a; 1. 双机热备的概念 双机热备是指保持两个数据库的状态自动同步&#xff0c;对任何一个数据库的操作都会自动应用到另一个数据库&am…

【深度学习】stable-diffusion-3,SD3生图体验

stabilityai/stable-diffusion-3-medium 代码地址&#xff1a; https://huggingface.co/stabilityai/stable-diffusion-3-medium 可在这里体验&#xff1a; https://huggingface.co/spaces/ameerazam08/SD-3-Medium-GPU

并查集C++

并查集的原理 并查集&#xff08;Union-Find Set&#xff09;。可以把每个连通分量看成一个集合&#xff0c;该集合包含了连通分量中的所有点。这些点两两连通&#xff08;连通性&#xff09;&#xff0c;而具体的连通方式无关紧要&#xff0c;就好比集合中的元素没有先后顺序之…

git-本地项目与git连接及上传【快速教程】

1. 本地项目新建上传 打开我们的项目&#xff0c;此时项目中是没有 .git 文件的在你的项目文件夹里面【鼠标右击】弹出菜单在【鼠标右击】弹出的菜单中&#xff0c;点击【Git Bash Here】在命令窗口中输入&#xff1a;git init在 Gitee 中 我们刚刚新建的仓库里&#xff0c;去…

【ARM Cache 及 MMU 系列文章 1.3 -- 如何判断 L2 Cache 是否实现?】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 CPU Configuration Register代码实现CPU Configuration Register 在 Armv9 架构中,我们可以通过arm 提供的自定义寄存器IMP_CPUCFR_EL1 来判断当前系统中是否实现了 L2 Cache, 如下所…

四六级翻译考前综合复习

翻译部分 东周时期 the Eastern Zhou Dynasty 南宋末年 the Late Southern Song Dynasty 早期/中期/末期 early/middle/late 3000多年前的中国西周 the Western Zhou Dynasty in/of China over 3,000 years ago 农历八月十五 on the 15th day of lunar Augest …

SpringBoot 实现 阿里云语音通知(SingleCallByTts)

目录 一、准备工作1.开通 阿里云语音服务2.申请企业资质3.创建语音通知模板&#xff0c;审核通过4.调用API接口---SingleCallByTts5.调试API接口---SingleCallByTts 二、代码实现1.导入依赖 com.aliyun:aliyun-java-sdk-dyvmsapi:3.0.22.创建工具类&#xff0c;用于发送语音通知…