[Java] 符号なし整数の扱い

2018年3月12日月曜日

Java

符号なし用メソッド達

Javaのintやlongは符号あり整数で、Cのunsignedのような修飾子は存在しないため、Javaでは変数の型を明示的に符号なし整数にすることはできない。
ただし、Long,Integerに用意されているメソッドを使えば、intやlongを実質符号なし整数とみなして計算することはできる。

それぞれ、以下のようなメソッドが用意されている。
  • compareUnsigned
  • divideUnsigned
  • remainderUnsigned
  • toUnsignedString
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Long.html

四則演算は除算しかないけど、divideUnsignedの説明に

2の補数計算で、他の3つの基本算術演算(加算、減算、および乗算)は、2つのオペランドがどちらも符号付き、またはどちらも符号なしと見なされる場合、ビット単位で同じであることに注意してください。したがって、個々のaddUnsignedなどのメソッドは提供されません。

とあるように、加減乗算はそのままやればいい。

maxUnsigned

例えば、2つの値を符号なし整数として比較して、大きい方を返すメソッドを実装するとしたらこんな感じ。
long maxUnsigned(long a, long b) {
    return Long.compareUnsigned(a, b) > 0 ? a : b;
}
ただし、変数の型は通常のlongと区別がつかないため、戻り値等が符号なしとして解釈されるべき値であることをコメントで残しておこう。