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

 

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返回错误的值

时间: 2024-10-26 00:27:28

Math.abs为Integer.Min_VALUE返回错误的值的相关文章

math.abs()是什么意思?

问题描述 math.abs()是什么意思? math.abs()是什么意思?以及与math相关的其它函数 解决方案 Java么?abs是返回绝对值.http://www.javaweb.cc/help/JavaAPI1.6/ 这个你看看吧,里边有Math,很多的,中文 解决方案二: 这个建议最好看源码,这里指出部分 /** * abs求绝对值 */ System.out.println(Math.abs(10.1)); //10.1 /** * ceil天花板的意思,就是返回大的值,注意一些特殊

介绍JavaScript中Math.abs()方法的使用

 这个方法返回一个数字的绝对值. 语法   1 Math.abs( x ) ; 下面是参数的详细信息: x : 一个数字 返回值: 返回一个数字的绝对值 例子:   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <html> <head> <title>JavaScript Math abs() Method</title> </head> <body> <scrip

介绍JavaScript中Math.abs()方法的使用_基础知识

 这个方法返回一个数字的绝对值. 语法 Math.abs( x ) ; 下面是参数的详细信息:     x : 一个数字 返回值: 返回一个数字的绝对值 例子: <html> <head> <title>JavaScript Math abs() Method</title> </head> <body> <script type="text/javascript"> var value = Math.

java取绝对值math.abs函数使用方法

兼容类型如下 static double abs(double a) 返回 double 值的绝对值. static float abs(float a) 返回 float 值的绝对值. static int abs(int a) 返回 int 值的绝对值. static long abs(long a) 返回 long 值的绝对值.  代码如下 复制代码 package com.java.lang;   public class Math {    /**   * @param args  

VLOOKUP函数返回错误值怎么办?

  VLOOKUP函数 返回错误值的原因和解决方法. 一. VLOOKUP函数基本语法 =VLOOKUP (lookup_value, table_array,col_index_num, [range_lookup]) 这个太复杂了哦,看鹅理解的VLOOKUP函数中文语法吧: =VLOOKUP(查找值,数据源,第几列,模糊查找1/精确查找0) 二. 实例说话 接下来,先看一个VLOOKUP函数的应用实例吧. 通过菜名查询库存数量. C11单元格公式如下: =VLOOKUP(B11,$B$3:$

解决Discuz! X2.0 邮件发送返回错误信息的办法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 最近在安装Discuz! X2.0时,检测邮件设置时,总是提示"邮件发送返回错误信息".(如图). 本人环境配置为: Linux 虚拟主机 服务器软件:Apache 服务器数据库:MySQL 百度一下,发现不少站长都遇上了这个问题,网上都是千篇一律的转载一篇Discuz的官方教程,但是根本无法解决"邮件发送返回错

JQuery ajax中error返回错误及一直返回error的解答_AJAX相关

进入百度搜索此问题,发现有人这么说了一句 Jquery中的Ajax的async默认是true(异步请求),如果想一个Ajax执行完后再执行另一个Ajax, 需要把async=false就可以了 于时我在ajax中进行了处理 async: false,结果发现提交正常的数据返回是正常的没有错误.  代码如下  $.ajax({ type: "POST", async: false, url:urllink, data:data, dataType:"html", su

微信公共平台-微信支付统一下单,请求prepareid返回错误

问题描述 微信支付统一下单,请求prepareid返回错误 始终是报appid和mch_id不匹配,但是查过上传xml文件,发现没有这个问题1

webform-远程服务器返回错误500 内部服务器错误

问题描述 远程服务器返回错误500 内部服务器错误 两次链接服务器上面的成功了,服务器代码也执行了,但是下面的uploadvalues却一直出现异常,到底是怎么回事回事,不管是链接server.aspx还是savegoods.sapx都同样发生异常,用别的客户端测试链接这两个.aspx都没有问题,到底是怎么回事,搞了好久了,一直搞不懂,求大神解惑.服务端代码如下 protected void Page_Load(object sender EventArgs e) { string s = Re