unsigned long longに相当するJavaですか?


106

C ++では、64ビットの符号なし整数、、unsigned long long intまたはを介してアクセスできましたuint64_t。現在、Javaではlongは64ビットです。ただし、署名されています。

Javaプリミティブとして利用可能なunsigned long(long)はありますか?どうやって使うの?


4
受け入れられた回答は、Java 8以降では古くなっています。番号を署名なしと見なすようにJavaに要求できる新機能については、GigaStoreによる回答を参照してください。日常の使用には適していませんが、必要なときに便利です。
バジルブルク2015

回答:


55

私はそうは思いません。署名されたlongよりも大きくなりたい場合は、BigIntegerが(箱から出して)唯一の方法だと思います。


17
この回答は少し古くなっています(2009年に投稿されました)。Java 8(2014年3月リリース)以降、unsigned longのサポートがあります。以下に投稿した例を回答として確認してください。
Amr

140

Java 8以降では、unsigned long(unsigned 64ビット)がサポートされています。それを使用する方法は次のとおりです。

Long l1 = Long.parseUnsignedLong("17916881237904312345");

印刷するには、単にl1を印刷することはできませんが、最初に以下を実行する必要があります。

String l1Str = Long.toUnsignedString(l1)

その後

System.out.println(l1Str);

@ j10、Long ul1 = Long.parseUnsignedLong(objScannerInstance.next("\\d+"));範囲チェックがないため、正確ではありませんが、そうでない場合、signed longの範囲を超える可能性のある長い数値入力を取り込むことができます。Scanner::next(...)PatternオブジェクトまたはStringパターンのいずれかを受け入れることもできるという事実を利用します。)
Spencer D

それは難しい。
Alex78191


7

いいえ、ありません。Javaの設計者は、未署名の整数が気に入らなかったと記録に残しています。代わりにBigIntegerを使用してください。詳細については、この質問を参照してください。


22
私はゴスリングを尊敬していますが、彼の署名のない整数の防衛は、私が今まで聞いた中で最も馬鹿げた言い訳の1つだと思います。:-) Javaにはunsigned intよりも不規則なものがたくさんあります... :-)
Brian Knoblauch

1
JavaPolis 2007でのGoslingは、unsigned intでは混乱を招いて機能しない例を示しました。Josh Blochさんは、signed intでも機能しないと指摘しました。任意のサイズの整数ftw!
トム・ホーティン-タックライン2009


2
@PP .:少なくとも1つがラッピング動作を定義している場合に、符号付き型と符号なし型の間の自由な相互作用を可能にする賢明なルールを定義することは不可能だと思います。ことであったが、符号なしバイトまたは符号なしのショートが発生しているだろう、と述べたゼロバイトはとにかく他のタイプと相互作用しないので、トラブルを。より大きな問題は、数値を表すために使用される型のラッピング動作が定義されていることです。これは、ラッピング動作が実際に役立つときにまれな場合(ハッシュコード計算など)のラッピング型を個別に持つこととは異なります。
スーパーキャット2014

3
@PP .:言語設計者に、数値を代数環と区別することの重要性を認識してほしい( "ラッピング整数"型とは)。任意のサイズの数値は暗黙的に任意のサイズのリングに変換する必要がありますが、リングは関数または同じサイズの数値への明示的な型キャストを介してのみ数値に変換する必要があります。符号なしの型は一般に代数環として動作しますが、数値として動作するCの動作は、おそらくすべての可能な世界の中で最悪です。ゴスリングがそれを避けたがったのは間違いではありませんが、彼はそうするためにまったく間違ったアプローチを取っていました。
スーパーキャット2014

6

Java 8は、これらのLong変数をunsigned Longとして直接処理できる一連のunsigned long演算を提供します。一般的に使用されるものをいくつか次に示します。

また、加算、減算、乗算は、符号付きlongと符号なしlongで同じです。


2
ソースコードをざっと見てみると、これらのメソッドには少し慎重であることがわかります。longが実際に負の場合(つまり、符号付きの場合と異なる場合)、BigIntegerクラスが使用されます。これは、最大8つの新しいBigIntegerが割り当てられることを意味します。これはかなり多く、間違いなくパフォーマンスが低下します。
Toonijn 2016

4

実行する予定の操作に応じて、結果はほとんど同じ、署名付きまたは署名なしです。ただし、簡単な操作を使用していない限り、BigIntegerを使用することになります。


4

unsigned longの場合、Guavaライブラリの UnsignedLongクラスを使用できます。

さまざまな操作をサポートします。

  • プラス
  • マイナス
  • モッド
  • で割った

現在欠けているように見えるのはバイトシフト演算子です。それらが必要な場合は、JavaからBigIntegerを使用できます。


3

Javaには符号なしの型はありません。すでに述べたように、BigIntegerのオーバーヘッドを発生させるか、JNIを使​​用してネイティブコードにアクセスします。


15
charは符号なし16ビット値です;)
ピーター・ローレイ

2

org.apache.axis.typesパッケージには

UnsignedLongクラス。

mavenの場合:

<dependency>
    <groupId>org.apache.axis</groupId>
    <artifactId>axis</artifactId>
    <version>1.4</version>
</dependency>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.