Java常见疑难问题-数值表达式3


16. Math.abs结果一定为非负数吗?
System.out.println(Math.abs(Integer.MIN_VALUE));// -2147483648
上面的程序不会输出2147483648,而是-2147483648,为什么?

其实我们看一下Math.abs源码就知道为什么了,:(a 我们就发现-Integer.MIN_VALUE= Integer.MIN_VALUE,所以上面的答案就是最小整数自
己。

另外我们也可以从API文档看到对Math.abs()方法的解释:如果参数等于
Integer.MIN_VALUE 的值(即能够表示的最小负 int 值),则结果与该值相同且为负。

所以Math.abs不能保证一定会返回非负结果。

当然,Long.MIN_VALUE也是这样的。
17. 不要使用基于减法的比较器
Comparator c = new Comparator() {
public int compare(Integer i1, Integer i2) {
return i1 – i2;// 升序
}
};
List l = new ArrayList();
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 }
18. int i=-2147483648与int i=-(2147483648)?
int i=-(2147483648);
通不过!为什么

int字面常量2147483638只能作为一元负操作符的操作数来使用。

类似的还有最大long:
long i=-(9223372036854775808L);

声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 智乐兔
转载请注明:转自《Java常见疑难问题-数值表达式3
本文地址:https://www.zhiletu.com/archives-236.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微