博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Math.abs为Integer.Min_VALUE返回错误的值
阅读量:7066 次
发布时间:2019-06-28

本文共 2373 字,大约阅读时间需要 7 分钟。

 
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。还要注意的是
0x7FFFFFFF
Integer.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_VALUE
long
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返回错误的值

转载于:https://www.cnblogs.com/dailidong/p/7571201.html

你可能感兴趣的文章
Java的接口总结
查看>>
C++复习
查看>>
cpsr与cpsr_c的区别
查看>>
星星评分
查看>>
Django - - Django REST framework基础:分页
查看>>
no module name cx_oracle 的解决方法
查看>>
poj - 2240 Arbitrage
查看>>
springmvc文件上传
查看>>
TypeScript 学习笔记
查看>>
Selenium3+python3-发送添加附件的邮件
查看>>
移动端-必要知识
查看>>
Redis指令
查看>>
Date12
查看>>
HTTP协议09-响应首部字段
查看>>
【原创】MySQL新旧版本ORDER BY 处理方法
查看>>
Cocos2d-x Eclipse下程序运行产生错误Effect initCheck() returned -1
查看>>
linux shell单引号、双引号及无引号区别(考试题答案系列)
查看>>
625某电商网站数据库宕机故障解决实录(下)
查看>>
创业公司感悟录之十个提醒—作者李天平
查看>>
.NET Project Open Day(2011.11.13)
查看>>