【Java中的负数取绝对值结果为什么不一定是正数?】

在这里插入图片描述

Java中的负数取绝对值结果为什么不一定是正数?

  • ✅典型解析
  • ✅扩展知识仓
    • ✅整型的取值范围
    • ✅超出范围怎么办

✅典型解析


假如,我们要用Math.abs对一个nteger取绝对值的时候,如果用如下方式:


Math .abs(orderId.hashCode());

得到的结果可能是个负数。原因要从Integer的取值范围说起,int的取值范围是-2^31—— (2^31)-1,即-2147483648 至 2147483647。


那么,当我们使用abs取绝对值时候,想要取得-2147483648的绝对值,那应该是2147483648。但是2147483648大于了2147483647,即超过了int的取值范围。这时候就会发生越界。


2147483647用 进制的 码表示是: 01111111 11111111 11111111 11111111


这个数 +1 得到: 1000000 00000000 00000000 0000000


这个二进制就是-2147483648的补码。


虽然,这种情况发生的概率很低,只有当要取绝对值的数字是-2147483648的时候,得到的数字还是个负数。


那么,如何解决这个问题呢?


既然是因为越界了导致最终结果变成负数,那就解决越界的问题就行了,那就是在取绝对值之前,把这个int类型转成long类型,这样就不会出现越界了。


如,前面我们取值逻辑修改为:


Math.abs((long)orderId.hashCode());

就万无一失了。

大家可以执行下以下代码:


public static void main(String[] args) {system.out.println(Math.abs((long)Integer .MIN VALUE));
}

得到的结果就是:

在这里插入图片描述


✅扩展知识仓

✅整型的取值范围


Java中的整型主要包含byte、short、int和long这四种,表示的数字范围也是从小到大的,之所以表示范围不同主要和他们存储数据时所占的字节数有关。


先来个简单的科普,1字节=8位 (bit) 。java中的整型属于有符号数。


先来看计算中8bit可以表示的数字:


最小值: 10000000 (-128) (-2^7) 最大值: 01111111 (127)(2^7-1)


整型的这几个类型中:

  • byte: byte用1个字节来存储,范围为-128(-2^7) 到 127(2^7-1),在变量初始化的时候,byte类型的默认值为0。
  • short: short用2个字节存储,范围为-32,768 (-2^15) 到 32,767(2^15-1),在变量初始化的时候,short类型的默认值为0,一般情况下,因为Java本身转型的原因,可以直接写为0。
  • int: int用4个字节存储,范围为-2,147,483,648(-2^31) 到 2,147,483,647 (2^31-1),在变量初始化的时候,int类型的默认值为0。
  • long: long用8 字节存储,范为-9,223,372,036,854,775,808(-2^63 ) 到 9 223.372,036 854775.80(2^63-1),在变量初始化的时候,long类型的默认值为0L或0l,也可直接写为0。

✅超出范围怎么办


上面说过了,整型中,每个类型都有一定的表示范围,但是,在程序中有些计算会导致超出表示范围,即溢出。如以下代码:


int i = IntegerMAX VALUE;
int j = Integer.MAX VALUE;
int k = i + j;
System.out.println("i (" + i+")+j(" +j+") = k(" + k +")");

输出结果: i(2147483647) +j(2147483647) = k (-2)


这就是发生了溢出,溢出的时候并不会抛异常,也没有任何提示。所以,在程序中,使用同类型的数据进行运算的时候,一定要注意数据溢出的问题。

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

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

相关文章

在Java Web开发中,Servlet功能与jsp功能可以相互转换吗

在Java Web开发中,Servlet和JSP是两种常用的Web组件,它们可以相互协作,也可以相互转换。 具体来说,Servlet可以实现所有JSP的功能,而JSP也可以调用Servlet中的方法。Servlet可以通过Java代码生成HTML页面,而…

一键转换,将HTML智能转换为PDF,轻松解决文档转换需求

在数字时代,HTML网页是我们获取信息的主要来源之一。然而,有时候我们可能需要将网页内容以PDF格式保存,以便于离线阅读、打印或分享。这时,将HTML转换为PDF就变得尤为重要。 首先,我们要进入首助编辑高手主页面&#x…

[CVPR-23] Instant Volumetric Head Avatars

[paper | code | proj] 本文提出INSTA。INSTA是一种backward mapping方法。该方法基于NeRF建立标准空间,形变空间(任意表情)通过映射回标准空间,实现渲染。为实现形变空间中任意点向标准空间的映射,对形变空间中的任意…

C++ Qt开发:TabWidget实现多窗体功能

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TabWidget标签组件的常用方法及灵活运用。 Q…

MVVM响应式

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介MVVM响应式1. 什么是MVVM模式?2. Vue中的响应式数据3. 数据绑定与视图更新⭐ 写在最后⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏!创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的学习…

IspSrver-DNS

2023年全国网络系统管理赛项真题 模块B-Windows解析 题目 安装DNS服务器,根据题目创建必要正向区域和反向区域的DNS解析。把当前机器作为互联网根域服务器,创建test1.com~test100.com,并在所有正向区域中创建一条A记录,解析到本机地址。配置步骤 安装DNS服务器,根据题目创…

3842充电器电路图大全

3842充电器电路图(一) UC3842组成的充电器电路 图1中C1、V1~V4、C2组成滤波整流电路,变压器T为高频变压器,V5、R2、C11组成功率开关管V7的保护电路,NF为供给IC电源的绕组。单端输出IC为UC3842,…

Nacos-服务发现与配置管理v1.0

Nacos - 服务发现和配置管理 教学目标 1)能够理解微服务架构的特点 2)能够理解服务发现的流程 3)能够说出Nacos的功能 4)掌握Nacos的安装方法 5)掌握RESTful服务发现开发方法 6)掌握Dubbo服务发现开…

ICC2:Less than minimum edge length和Concave convex edge enclosure

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 首先,要介绍一下这两种drc Less than minimum edge length对应的tf rule如下: 而Concave convex edge enclosure对应图示和tf 规则如下,可

信息论安全与概率论

目录 一. Markov不等式 二. 选择引理 三. Chebyshev不等式 四. Chernov上限 4.1 变量大于 4.2 变量小于 信息论安全中会用到很多概率论相关的上界,本文章将梳理几个论文中常用的定理,重点关注如何理解这些定理以及怎么用。 一. Markov不等式 假定…

仙女麻麻看过来~你想要的穿搭我都有

精选优质匈牙利白鸭绒填充绒朵大而蓬松,毫无异味整件格充绒工艺不跑绒 更加的保暖舒适版型优秀显瘦不臃肿 黑色经典好穿又好看!

获取请求体中json数据并解析到实体对象

目录 相关依赖 前端代码 后端代码 测试结果 相关依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version> </dependency> <dependency><groupId>comm…

【HarmonyOS开发】ArkUI实现下拉刷新/上拉加载

列表下拉刷新、上拉加载更多&#xff0c;不管在web时代还是鸿蒙应用都是一个非常常用的功能&#xff0c;基于ArkUI中TS扩展的声明式开发范式实现一个下拉刷新&#xff0c;上拉加载。 上拉加载、下拉刷新 如果数据量过大&#xff0c;可以使用LazyForEach代替ForEach 高阶组件-…

Seata1.4.2分布式事务搭建部署【Spring cloud Alibaba】

包下载 https://github.com/apache/incubator-seata/releases下载并上传到服务器 //解压 tar -zxvf seata-server-1.4.2.tar.gz创建Seata的数据库及表&#xff0c;地址&#xff1a;https://github.com/seata/seata/tree/develop/script/server 根据数据类型复制相应的sql&…

【 USRP安装教程】MATLAB 2023B

步骤 matlabdocusrp驱动包 doc 安装包内容列表 双击“R2023b_Doc_Windows.iso” 打开cmd 查看盘符 切换盘符 因为是F盘&#xff0c;所以cmd输入&#xff1a;“F:” F:进入可安装界面 cd F:\bin\win64安装离线文档库 .\mpm install-doc --matlabroot"C:\MATLAB\R202…

Java 第14章 集合 本章作业

文章目录 试分析HashSet和TreeSet分别如何实现去重的HashSet重复加入问题比较ArrayList和Vector 试分析HashSet和TreeSet分别如何实现去重的 (1) HashSet的去重机制&#xff1a;hashCode() equals()&#xff0c;底层先通过存入对象,进行运算得到一个hash值&#xff0c;通过ha…

scrapy_redis原理分析并实现断点续爬以及分布式爬虫

scrapy_redis原理分析并实现断点续爬以及分布式爬虫 学习目标 了解 scrapy实现去重的原理了解 scrapy中请求入队的条件掌握 scrapy_redis基于url地址的增量式单机爬虫掌握 scrapy_redis分布式爬虫 1. 下载github的demo代码 clone github scrapy-redis源码文件 git clone http…

比 style gan 更好的 style gan2

上一篇博客介绍了style gan 原理&#xff0c;但是 style gan 的结果会有水珠伪影&#xff0c;作者实验后发现是 Adain 导致的&#xff0c;AdaIN对每一个feature map的通道进行归一化&#xff0c;这样可能破坏掉feature之间的信息。当然实验证明发现&#xff0c;去除AdaIN的归一…

华为数通方向HCIP-DataCom H12-831题库(多选题:201-220)

第201题 在多集群RR组网中,每个集群中部署了一台RR设备及其客户机,各集群的RR与为非客户机关系,并建立IBGP全连接。以下关于BGP路由反射器发布路由规则的描述,正确的有哪些? A、若某RR从EBGP对等体学到的路由,此RR会传递给其他集群的RR B、若某RR从非客户机IBGP对等体学…

QT打包exe文件,在其它电脑里双击exe就可以直接运行

想要不依赖QT环境&#xff0c;在其它电脑里直接双击exe文件就可以运行当前程序。具体打包过程如下&#xff1a; 使用QT编译出release版本的exe release版本运行无误后&#xff0c;需要找到当前构建生成的exe所在文件夹 可以看到具体目录在这里 我在该目录下的bin文件夹里找到…