<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont

简介:  Math.abs为Integer.Min_VALUE返回错误的值 这段代码:System.out.println(Math.
 
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返回错误的值
目录
相关文章
|
存储 Web App开发 监控
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
我们以前使用过的对hbase和hdfs进行健康检查,及剩余hdfs容量告警,简单易用 1.针对hadoop2的脚本: #/bin/bashbin=`dirname $0`bin=`cd $bin;pwd`STATE_OK=...
1297 0
|
SQL Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
在运行一个group by的sql时,抛出以下错误信息: Task with the most failures(4):  -----Task ID:  task_201411191723_723592_m_000004URL:  http://DDS0204.
1249 0
|
Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
异步通信 对于BS(Browser-Server 浏览器)架构,很多情景下server的处理时间较长。 如果浏览器发送请求后,保持跟server的连接,等待server响应,那么一方面会对用户的体验有负面影响; 另一方面,很有可能会由于超时,提示用户服务请求失败。
963 0
|
Web App开发 前端开发 关系型数据库
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
fuser可用于查询文件、目录、socket端口和文件系统的使用进程 1.查询文件和目录使用者 fuser最基本的用法是查询某个文件或目录被哪个进程使用: # fuser -v .
1108 0
|
Web App开发 前端开发
|
Web App开发 前端开发
|
存储 监控 数据库
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
为首次部署MongoDB做好准备:容量计划和监控 作者Mat Keep ,译者孙镜涛如果你已经完成了自己新的MongoDB应用程序的开发,并且现在正准备将它部署进产品中,那么你和你的运营团队需要讨论一些关键的问题: 最佳部署实践是什么? 为了确保应用程序满足它所必须的服务层次我们需要监控哪些关键指标? 如何能够确定添加分片的时机? 有哪些工具可以对数据库进行备份和恢复? 怎样才能安全地访问所有新的实时大数据? 本文介绍了硬件选择、扩展、HA和监控。
2879 0
|
Web App开发 前端开发 算法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
基于大数据的精准营销与应用场景 2015年08月11日 大数据 大数据营销时代来临营销学领域过去半个多世纪的发展让我们见证了从“以产品为中心”到“以客户为中心”的转变。
1199 0
|
Web App开发 前端开发 Java
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
 Connection reset by peer的常见原因: 1)服务器的并发连接数超过了其承载量,服务器会将其中一些连接关闭;    如果知道实际连接服务器的并发客户数没有超过服务器的承载量,看下有没有网络流量异常。
1161 0

热门文章

最新文章