[Java] Unsigned Integer Arithmetic API now in JDK 8

ついに、議論とレビューをうけて、符号なし整数算術計算APIの初のサポートがようやくJDK8に入ることになりました。このサポートは静的メソッド(主にjava.lang.Integerおよびjava.lang.Long上)を介して実装されます。
  • 文字列と符号なし整数間の双方向変換を提供する
  • 符号なし整数として値を比較
  • 符号なし整数の除算と剰余を計算する
JDK 8 code review request for initial unsigned integer arithmetic library support
http://mail.openjdk.java.net/pipermail/core-libs-dev/2012-January/008926.html
4504839: Java libraries should provide support for unsigned integer arithmetic
http://hg.openjdk.java.net/jdk8/tl/jdk/rev/71200c517524

口語表現では、「符号なし整数」は、32ビットintまたは64ビットlong値で、全てのビットを使って大きさを表すものとして解釈されます。符号なしの領域では、指定されたビット幅の範囲の整数型の値は、0から2(ビット幅)-1です(-2(ビット幅)-1~2(ビット幅)-1-1ではありません)。Javaの整数の2の補数のエンコーディングの機能は、両方の入力が符号付きもしくは符号なしの整数値として解釈されている場合、加算、減算、および乗算のためのビット単位の結果が同じであるということです (1の補数や符号付きの値のような他のエンコーディングにはこの機能がありません)。したがって、基本的な算術演算では、唯一独立した除算方式を、符号なしとして解釈された値で演算できるようにする必要があります。
ボックス化された値のオーバーヘッド処理を避けるためと、組み込みの算術演算子を再利用するため、符号なしAPIのサポートでは、加算、減算、等を実行するためのインスタンスメソッドを持つUnsignedIntのような新しい型を導入することはありません。しかし、それとは別に、Javaレベルの符号無し型がないがゆえに、プログラマーが誤って符号あり数値と符号無し数値を混在させる可能性があります。しかし、新しい符号なしの型は、この危険を軽減する唯一の方法というわけではありません。例えば、符号なしの値を保持する変数の末尾に"U"または"_U"を追加するという命名規則を採用する方法もあります。より体系的なアプローチには、プラットフォームに@Unsigned アノテーション型を追加し、符号なしの値を保持する変数やフィールドにそのアノテーションを適用する方法もあります。その場合、JSR308で可能になる言語外チェッカーの一つで、コードを分析して符号付き/符号なしをチェックすることができるでしょう。

JSR 308: Annotations on Java Types
http://jcp.org/en/jsr/summary?id=308

これらのメソッドがJDKにようやく入ることをうれしく思います。JDK 8以後では、もっと興味深いビット操作の追加があるかもしれません。例えば、完全な乗法の高次ビットを取得するメソッドや、ラップアラウンドの代わりに整数のオーバーフローに関する例外を投げるメソッドなどです。

JVM Language Summit: Numbers big and fixed
http://blogs.oracle.com/darcy/entry/jvmlang_numbers


原文はこちら。
http://blogs.oracle.com/darcy/entry/unsigned_api

0 件のコメント:

コメントを投稿