符号なし整数のサポート

Java組み込みの整数型は符号付きしかサポートしておらず、その範囲を超える値を扱う場合、これまではBigDecimalを使用する必要があった。BigDecimalは内部的には文字列として値を保持しているため、プリミティブ型での処理と比べると効率が悪いという問題がある。

Java 8では従来の符号付きの整数型を符号なしの整数型とみなして扱うためのstaticメソッドがIntegerとLongに追加されている。これらを使用することで正負は表現できないものの、より広い範囲の値を表すことができるようになる。

// intの最大値(2147483647)に対して加算する
int a = Integer.MAX_VALUE + 1;
// そのまま表示すると桁あふれを起こし負の数として表示される
System.out.println(a); // => -2147483648
// Integer#toUnsignedString()で符号なし整数として表示すると正しい結果が表示される
System.out.println(Integer.toUnsignedString(a)); // => 2147483648

符号なし整数の場合も四則演算のうち、加算・減算・乗算は通常の整数と同じように組み込みの算術演算子を使用して行うが、除算および剰余については計算対象の値を符号付き整数とみなすか符号なし整数とみなすかで計算結果が変わってしまう場合があるため、IntegerクラスもしくはLongクラスのdivideUnsigned()メソッド、remainderUnsigned()メソッドを使用する必要がある。

// 除算
int c = Integer.divideUnsigned(a, b);
// 剰余
int d = Integer.remainderUnsigned(a, b);