1. ホーム
  2. java

[解決済み] Java 8とJava 9で符号なし整数を使用するには?

2023-04-18 20:22:02

質問

Oracleのquot;Primitive data types"で。 ページ のページでは、Java 8 が符号なし int と long のサポートを追加することに言及しています。

int : デフォルトでは int のデータ型は 32 ビット符号付き 2 の補数で、最小値は -2 です。 31 であり,最大値は 2 31 -1. Java SE 8 以降では int データ型を使用して符号なし32ビット整数を表し、最小値0、最大値2です 32 -1. を使用します。 Integer クラスを使用することで int のデータ型を符号なし整数とします。詳細は、「数値クラス」のセクションを参照してください。のような静的メソッドは compareUnsigned , divideUnsigned などが追加され Integer クラスが追加され、符号なし整数の算術演算がサポートされるようになりました。

long : は long のデータ型は64ビットの2の補数整数である。符号付きの long は最小値として -2 63 であり、最大値は 2 63 -1. Java SE 8 以降では、"strong" の代わりに long データ型を使用して、符号なし64ビットを表す long であり、最小値0、最大値2です。 64 -1. intが提供する値よりも広い範囲の値が必要な場合に、このデータ型を使用します。また Long クラスには、次のようなメソッドもあります。 compareUnsigned , divideUnsigned などで、符号なし演算をサポートする long .

しかし、unsigned longやintegerを宣言する方法が見当たりません。たとえば、次のコードは、範囲内にあるはずのリテラル (割り当てられた値は正確に 2) が、コンパイラ エラー メッセージ "the literal is out of range" (もちろん、Java 8 を使用しています) になっています。 64 -1):

public class Foo {
    static long values = 18446744073709551615L;
    
    public static void main(String[] args){
        System.out.println(values);
    }  
}

では、unsigned intやlongを宣言する方法はあるのでしょうか?

どのように解決するのですか?

投稿されたドキュメントによると このブログの記事 - を見ると、プリミティブを宣言する際に符号なしint/longと符号ありint/longに違いはないようです。 新しいサポートは、Integer および Long クラスに静的メソッドが追加されたことです。 Integer.divideUnsigned . これらのメソッドを使用していない場合、2^63-1 以上の "unsigned" long は負の値を持つ単なる古い long になります。

ざっと見たところ、+/- 2^31-1、またはlongの場合は+/- 2^63-1の範囲外の整数定数を宣言する方法がないように見えます。 範囲外の正の値に対応する負の値を手動で計算する必要があります。