如下面的代码:
public class Test
{
private static final int N = 3;
public static void main(String[] args)
{
for(int i=Integer.MIN_VALUE; i<Integer.MIN_VALUE+5; i++)
System.out.println(Math.abs(i)%N);
}
}
输出结果为:
-2
1
0
2
1
我们知道,对一个正整数进行取余操作,其结果是一个非负整数。而对一个负整数进行绝对值运算,其结果是一个正整数。那这里为什么会出现出现一个负数呢?
如下面的代码:
public class Test
{
public static void main(String[] args)
{
for(int i=Integer.MIN_VALUE; i<Integer.MIN_VALUE+5; i++)
System.out.println(Math.abs(i));
}
}
输出结果为:
-2147483648
2147483647
2147483646
2147483645
2147483644
也就是说,Math.abs(Integer.MIN_VALUE)的值还是其本身。通过查阅Java的API文档,我们看到对abs(int a)运算,“如果参数等于 Integer.MIN_VALUE
的值(即能够表示的最小负 int
值),那么结果与该值相同且为负。”所以会有这样的结果。
这样也就出现了一个问题,即上面的取余操作不是很合适的。下面的代码展示了一个真正的取余运算。
public class Test
{
private static final int N = 3;
public static void main(String[] args)
{
int result = 0;
for(int i=Integer.MIN_VALUE; i<Integer.MIN_VALUE+5; i++)
{
result = Math.abs(i) % N;
System.out.println(result < 0 ? (result + N) : result);
}
}
}
输出结果为:
1
1
0
2
1