Math.abs为Integer.Min_VALUE返回错误的值

简介:   Math.abs为Integer.Min_VALUE返回错误的值 这段代码: System.out.println(Math.abs(Integer.
 
Math.abs为Integer.Min_VALUE返回错误的值 这段代码:
System.out.println(Math.abs(Integer.MIN_VALUE));
回报 -2147483648这难道不应该返回绝对值 2147483648


-------------------------------------------------------------------------------------------------------------------------

1. Integer.MIN_VALUE-2147483648的,但一个32位整数可以包含最高值是 +2147483647。试图代表 +2147483648在32位int将有效地“翻转”到 -2147483648。这是有符号整数,两个的二进制表示 +2147483648-2147483648是相同的。这一点,也没有问题,但如 +2147483648被认为是超出范围。 对于在这个问题上多一点读书,你可能要检查出两个的维基百科的文章
2. 下面是Java的医生说的Math.abs()
3. 你指出的行为确实,反直觉的。但是,此行为是由javadoc文档中指定的 Math.abs(int):如果不是负数,则返回。 如果是负的,否定的,则返回。即, Math.abs(int)应该像下面的Java代码:
public static int abs(int x){
 if (x >= 0) {
  return x;
 }
 return -x;
}
也就是说,在否定的情况下, -x。 按照JLS的第15.15.4中, -x等于 (~x)+1,其中 ~是位运算符。 要检查这是否听起来很正确,让我们-1为例。 整数值 -1是可记为 0xFFFFFFFF在十六进制中的Java(看看这个用 println或任何拍摄 -(-1)给出:
-(-1) = (~(0xFFFFFFFF)) + 1 = 0x00000000 + 1 = 0x00000001 = 1
因此,它的工作原理。 现在尝试用 Integer.MIN_VALUE。知道的最低整数可以表示为 0x80000000,即,优先位设置为1,并设置为0的31个剩余比特,我们有:
-(Integer.MIN_VALUE) = (~(0x80000000)) + 1 = 0x7FFFFFFF + 1 
      = 0x80000000 = Integer.MIN_VALUE
这就是为什么 Math.abs(Integer.MIN_VALUE)回报 Integer.MIN_VALUE。还要注意的是 0x7FFFFFFFInteger.MAX_VALUE。 这就是说,我们如何才能避免出现问题,由于在未来的这个反直觉的返回值?我们可以,正如,铸就我们 ints到 long之前。然而,我们必须要么赶逐回 ints,这不工作 Integer.MIN_VALUE == (int) Math.abs((long)Integer.MIN_VALUE)。 或继续 long•本希望我们永远不会调用 Math.abs(long)用一个值等于 Long.MIN_VALUE,因为我们也有 Math.abs(Long.MIN_VALUE) == Long.MIN_VALUE。我们 BigInteger到处都是, BigInteger.abs()确实总是返回一个正值。这是一个很好的选择,硬朗的操控比原始整数类型有点慢。 我们可以写我们自己的包装器 Math.abs(int),像这样:
/**
 * Fail-fast wrapper for {@link Math#abs(int)}
 * @param x
 * @return the absolute value of x
 * @throws ArithmeticException when a negative value would have been returned by {@link Math#abs(int)}
 */
public static int abs(int x) throws ArithmeticException {
 if (x == Integer.MIN_VALUE) {
  // fail instead of returning Integer.MAX_VALUE
  // to prevent the occurrence of incorrect results in later computations
  throw new ArithmeticException("Math.abs(Integer.MIN_VALUE)");
 }
 return Math.abs(x);
}
作为最后一点,这个问题似乎是众所周知的见,例如有关相应的FindBugs规则此项。
4. 一看就知道你期待的结果,投 Integer.MIN_VALUElong
System.out.println(Math.abs((long) Integer.MIN_VALUE));

5. 2147483648不能存储在java中一个整数,其二进制表示是为-2147483648。
6. (int) 2147483648L == -2147483648有一个负数而没有正相当于所以没有积极的价值吧。你会看到则为Long.MAX_VALUE的行为。

本文标题 :Math.abs为Integer.Min_VALUE返回错误的值
目录
相关文章
|
5月前
|
人工智能 自然语言处理 前端开发
上线几天,轻松斩获10k,开源通用AI智能体Suna:一句话自动处理Excel/爬数据/写报告,程序员私人助理诞生!
Suna是由Kortix推出的全球首个开源通用型AI Agent,可通过自然语言对话自动完成浏览器操作、数据分析、系统管理等复杂任务。它具有“执行力”,能像人类员工一样理解指令并操作数字工具,支持自托管保障数据安全,适用于市场分析、学术研究、企业办公等场景。Suna的核心优势在于实现“语言→行动”的转化,适合需要实际操作的任务,如爬虫、报表生成和网站部署。项目地址为:https://github.com/kortix-ai/suna。
458 0
|
存储 缓存 测试技术
现代化实时数仓 SelectDB 再次登顶 ClickBench 全球数据库分析性能排行榜!
近日,在 ClickHouse 发起的分析型数据库性能测试排行榜 ClickBench(https://benchmark.clickhouse.com/)中,现代化实时数仓 SelectDB 时隔两年后再次登顶,在全部近百款数据库和数十种机型中,性能表现位居总榜第一!
528 1
|
数据可视化 搜索推荐 算法
11种 Matplotlib 科研论文图表实现 !!
11种 Matplotlib 科研论文图表实现 !!
650 0
|
存储 机器学习/深度学习 数据挖掘
探究数据仓库与数据湖的异同及应用场景
在数据分析与处理方面,数据仓库与数据湖是两种广泛运用的数据架构。本文将深入剖析数据仓库与数据湖的概念、特点、使用场景以及二者之间的区别和联系,帮助读者更好地了解这两种数据架构的优缺点。
|
JSON JavaScript 关系型数据库
|
Ubuntu
ubuntu 16.04 蓝牙鼠标 (可连接但是无法使用)
ubuntu 16.04 蓝牙鼠标 (可连接但是无法使用)
398 0
|
存储 机器学习/深度学习 人工智能
百倍加速IO读写!快使用Parquet和Feather格式!⛵
本文介绍了 Parquet 和 Feather 两种文件类型,可以提高本地存储数据时的读写速度,并压缩存储在磁盘上的数据大小。大型 CSV 文件的克星!用起来~
476 1
百倍加速IO读写!快使用Parquet和Feather格式!⛵
|
存储 SQL 分布式计算
小迈科技 X Hologres:高可用的百亿级广告实时数仓建设
通过本文,我们将会介绍小迈科技如何通过Hologres搭建高可用的实时数仓。
2483 3
小迈科技 X Hologres:高可用的百亿级广告实时数仓建设
|
Linux 网络安全 数据安全/隐私保护
CentOS Stream 9通过配置sshd_config中AllowUsers实现SSH访问控制
CentOS Stream 9通过配置sshd_config中AllowUsers实现SSH访问控制
2005 0
CentOS Stream 9通过配置sshd_config中AllowUsers实现SSH访问控制
|
存储 机器学习/深度学习 分布式计算
切记:不要让您的数据湖变成数据沼泽
数据湖的概念已经存在了几年了。它最初引起了一些争议,并被贴上了营销炒作的标签。数据湖这个术语并不是任何传统数据存储体系结构的一部分,因此供应商可以自由地使用它来表示许多不同的东西。
切记:不要让您的数据湖变成数据沼泽