IT Notes‎ > ‎Java‎ > ‎Java Language‎ > ‎《Java 解惑》笔记‎ > ‎

Puzzle 64: The Mod Squad

最小整数的绝对值是其自身


按:一看标题,就有几个错误,一,整数没有最小;二,负数的绝对值是其相反数。但是,在这里,话题的约束是:在Java里去考虑。

本问题用到的类:
public class Mod {

    public static void main(String[] args) {
        final int MODULUS = 3;
        int[] histogram = new int[MODULUS];

        // Iterate over all ints (Idiom from Puzzle 26)
        int i = Integer.MIN_VALUE;
        do {
            histogram[Math.abs(i) % MODULUS]++;
        } while (i++ != Integer.MAX_VALUE);

        for (int j = 0; j < MODULUS; j++) {
            System.out.println(histogram[j] + " ");
        }
    }
}

运行,会抛错:

因为,Integer.MIN_VALUE % 3 == -2,而Math.abs(Integer.MIN_VALUE) == Integer.MIN_VALUE,所以会出现上面的错误。

对于Math的abs(int)和abs(long)方法,Java API docs里说明了例外的情况,那就是如果参数是Integer.MIN_VALUE或者Long.MIN_VALUE,返回值是其本身。这个是Java在具体实现的时候,无可奈何的,Integer和Long用补码表示,负数的个数比整数多一,导致最小的负数的相反数没有对应的正数去表达,而按照补码的规则,算下来,竟然是其自身。



  1. Puzzle 1: Oddity
  2. Puzzle 26: In the Loop
  3. java.lang.Math.abs(int)
  4. TODO: 关于模运算,尤其是负数的模运算,貌似还没有确切的定义,不通的产品在实现上有一些不通,以前统计过一小点,找到那篇文档,按(-, -), (-, +), (+, -)的方式调查一下相关的软件或者语言(C, JAVA, JS, OPENOFFICE, MS OFFICE AND ETC..)
  5. JSL 15.17.3 Remainder Operator %
Comments