Math.abs 竟然返回了负数???

简介: Math.abs 竟然返回了负数???

「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!

事情是这样的。

某一天扯扯群里发来一段代码:


image.png


读者提问道,为啥这个 pos 还要判断一下?

这代码一看我就熟悉,RocketMQ 的源码,如果你看过源码你会发现到处都有这样的判断。

想着已经取绝对值了,然后再取余,肯定是正数啊,这 if(pos<0) 不就是多余的判断吗?


image.png

滴。

再解释一下为什么 int 最小值取绝对值还是等于它本身。

int 是 32 位,为了便于演示,我就拿 8 位来举例子,反正道理是一样的。

在 Java 中的数字的实现都是有符号位的,不像 C 有个 unsigned 来表示无符号,有符号的数字实现是用最高位来表示符号位,1表示负数,0表示正数。


image.png


图中就是向上溢出得到了最小值,所以最小值取绝对值得到的值比最大值大一,导致向上溢出,又变成了最小值。

因此 Math.abs(Integer.MIN_VALUE) = Integer.MIN_VALUE

那为什么 8 位表示的是-128到127而不是-127到128?

8位二进制,一共有2^8=256个坑位,所以能表示 256 个数字,理论上随便怎么表示都ok,你表示-254~1都行。

但是我们规定无符号数是 0~255,有符号数规定是-128 ~ 127。

如果有符号数要规定成-127到128并不是不行,但是这样就比较麻烦。

按照-128 ~ 127这样的实现,我们只要通过最高位就可以判断一个数的正负,而-127~128就需要排除128这个特例,也就是之前只需要判断最高位,现在变成需要判断最高位为 1 且其它位不全是 0 才是负数。

这样电路设计也要变复杂了,所以我们规定是 -128到127,32位也同理。

Math.absExact

这种出错了但是没有提示的 Math.abs 肯定是不好的,所以在 JDK 15 出了个  Math.absExact


image.png


也就是会抛错,而不是返回个错误的结果。


最后


有位群友还说面百度的时候被问过。

image.png

面试题是真的多,防不胜防。

好了,今天的分享到此结束

更多面试题可以看我汇总的仓库,每个面试题都是含答案的,Java基础已经更新完毕~

面试仓库(含答案)


image.png


相关文章
|
监控 网络协议 Java
《Java工程师成神之路》阿里技术专家之作,囊括Java所有知识点!
很多Java程序员一直希望找到一份完整的学习路径,但是市面上很多书都是专注某一个领域的,没有一份完整的大图,以至于很多程序员很迷茫,不知道自己到底应该从哪里开始学,或者不知道自己学习些什么。
|
弹性计算 资源调度 Kubernetes
Flink三种集群模式,Standalone模式,Flink On YARN,Flink On K8S,这三种模式有啥优缺点,生产环境如何选择呢?
Flink三种集群模式,Standalone模式,Flink On YARN,Flink On K8S,这三种模式有啥优缺点,生产环境如何选择呢?
1767 3
|
SQL 机器学习/深度学习 运维
实时计算 Flink:基于 Apache Flink 构建的大数据计算平台(附白皮书)
实时计算 Flink版是阿里云提供的基于 Apache Flink 构建的企业级、高性能实时大数据处理系统,由Apache Flink创始团队官方出品。
|
SQL 程序员
sql中的distinct用法
`DISTINCT`在SQL中用于返回唯一不同的值,消除结果集中的重复行。基本用法包括:1) 选择单列唯一值,如`SELECT DISTINCT department FROM employees;`
1023 0
|
SQL 消息中间件 Java
(转)Spring Boot加载 不同位置的 application.properties配置文件顺序规则
这篇文章介绍了Spring Boot加载配置文件的顺序规则,包括不同位置的application.properties文件的加载优先级,以及如何通过命令行参数或环境变量来指定配置文件的名称和位置。
512 2
(转)Spring Boot加载 不同位置的 application.properties配置文件顺序规则
|
11月前
|
SQL XML Java
Mybatis中foreach的使用
【11月更文挑战第12天】MyBatis 的 `foreach` 标签用于在 SQL 语句中遍历集合或数组,支持批量插入、更新及多条件查询等操作。通过设置 `collection`、`item` 等属性,可动态生成 SQL 片段,实现高效的数据处理。示例包括批量插入用户信息、根据 ID 列表查询用户数据以及遍历 Map 查询分类下的产品。
620 0
|
Java 关系型数据库 数据库连接
greenplum驱动都有哪几个
【5月更文挑战第23天】greenplum驱动都有哪几个
447 4
|
设计模式
从零开始学设计模式(十八):状态模式(State Pattern)
状态模式(State Pattern)指的是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化,在其内部状态改变时改变它的行为。状态模式是一种对象行为型模式。它和策略模式有一点很像,就是将一些复杂的逻辑放在一个专门的上下文类中进行处理。
1614 0
从零开始学设计模式(十八):状态模式(State Pattern)
|
存储 分布式计算 关系型数据库
Hbase原理介绍和使用场景分析
Hbase原理介绍和使用场景分析
1270 0
|
存储 Java 分布式数据库
HBase的数据一致性是如何保证的?
HBase的数据一致性是如何保证的?
309 0