Java常见疑难问题-数值表达式3
16. Math.abs结果一定为非负数吗?
System.out.println(Math.abs(Integer.MIN_VALUE));// -2147483648
上面的程序不会输出2147483648,而是-2147483648,为什么?
其实我们看一下Math.abs源码就知道为什么了,源码:(a < 0) ? -a : a;,结合上面那个迷题,
我们就发现-Integer.MIN_VALUE= Integer.MIN_VALUE,所以上面的答案就是最小整数自
己。
另外我们也可以从API文档看到对Math.abs()方法的解释:如果参数等于
Integer.MIN_VALUE 的值(即能够表示的最小负 int 值),则结果与该值相同且为负。
所以Math.abs不能保证一定会返回非负结果。
当然,Long.MIN_VALUE也是这样的。
17. 不要使用基于减法的比较器
Comparator
public int compare(Integer i1, Integer i2) {
return i1 – i2;// 升序
}
};
List
l.add(new Integer(-2000000000));
l.add(new Integer(2000000000));
Collections.sort(l, c);
System.out.println(l);// [2000000000, -2000000000]
上面程序的比较器是升序,结果却不是这样,比较时出现了什么问题?
先看看下面程序片断:
int x = -2000000000;
int y = 2000000000;
/*
* -2000000000 即 -(01110111001101011001010000000000)
* 的补码为: 10001000110010100110110000000000
*
* 计算过程使用竖式表示:
* 10001000110010100110110000000000
* 10001000110010100110110000000000
* ——————————–
* 00010001100101001101100000000000
*
* 计算结果溢出,结果为294967296
*/
System.out.println(x – y);// 294967296
所以不要使用减法的比较器,除非能确保要比较的数值之间的距离永远不会大于Intger.
MAX_VALUE。
基于整型的比较器的实现一般使用如下的方式来比较:
public int compare(Integer i1, Integer i2) {
return (i1 < i2 ? -1 : (i1 == i2 ? 0 : 1));
}
18. int i=-2147483648与int i=-(2147483648)?
int i=-(2147483648);
编译通不过!为什么
int字面常量2147483638只能作为一元负操作符的操作数来使用。
类似的还有最大long:
long i=-(9223372036854775808L);
声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 嗅谱网
转载请注明:转自《Java常见疑难问题-数值表达式3》
本文地址:http://www.xiupu.net/archives-236.html
关注公众号:
微信赞赏
支付宝赞赏