2009-02-03 24 views
95

In C++ hatte ich gerne Zugang zu einer 64-Bit-Ganzzahl ohne Vorzeichen, über unsigned long long int, oder über uint64_t. Nun, in Java sind Longs 64 Bit, ich weiß. Sie sind jedoch unterschrieben.Java-Äquivalent von unsigned long lang?

Gibt es ein unsigned long (long) als Java-Primitiv? Wie benutze ich es?

+3

** Hinweis ** Die akzeptierte Antwort wird als Java-8 und später veraltet. In der [Antwort von GigaStore] (http://stackoverflow.com/a/25248688/642706) finden Sie die neue Funktion, mit der Sie Java bitten können, eine Zahl als nicht signiert zu betrachten. Nicht für den täglichen Gebrauch, aber praktisch, wenn Sie es brauchen. –

Antwort

51

Ich glaube nicht. Sobald Sie größer als eine lange signiert werden wollen, denke ich, BigInteger ist die einzige (out of the Box) Weg zu gehen.

+14

Diese Antwort ist ein wenig veraltet (es wurde 2009 veröffentlicht). Ab Java 8 (Release März 2014) gibt es Unterstützung für unsigned long. Überprüfen Sie ein Beispiel, das ich als Antwort unten gepostet habe. – Amr

7

Nein, gibt es nicht. Die Entwickler von Java sind zu Protokoll, dass sie nicht signierte Ints mögen. Verwenden Sie stattdessen eine BigInteger. Details finden Sie unter this question.

+19

Ich respektiere Gosling für das, was er getan hat, aber ich denke, dass seine Verteidigung von nicht unterschriebenen Ints eine der dümmsten Ausreden ist, die ich je gehört habe. :-) Wir haben waaaay mehr wackelige Sachen in Java als unsigned ints ... :-) –

+0

Gosling bei JavaPolis 2007 gab ein Beispiel, das verwirrenderweise nicht für unsigned ints funktioniert. Josh Bloch wies darauf hin, es funktioniert auch nicht für signierte Ints. Beliebig große Integer ftw! –

+21

Ich respektiere Gosling nicht für das, was er getan hat. Zu sagen, dass die Leute unsignierte Mathematik nicht verstehen? Es ist signierte Mathematik, die komplex ist, besonders auf der Bit-Ebene. Ich verstehe nicht, warum Leute Java lieben, wenn es eindeutig für dumme Leute geschrieben wurde (vielleicht ist es der subtilste Witz der Informatik?). –

12

Nein, gibt es nicht. Sie müssen den primitiven Datentyp long verwenden und Probleme mit der Signiertheit behandeln oder eine Klasse wie BigInteger verwenden.

3

Java hat keine vorzeichenbehafteten Typen. Wie bereits erwähnt, nutzen Sie den Overhead von BigInteger oder verwenden Sie JNI, um auf nativen Code zuzugreifen.

+14

char ist ein vorzeichenloser 16-Bit-Wert;) –

+6

ARGH! Da haben Sie mich erwischt. Gut gemacht, mein Freund – basszero

4

Je nachdem, welche Operationen Sie ausführen möchten, ist das Ergebnis weitgehend dasselbe, signiert oder unsigniert. Wenn Sie jedoch keine trivialen Operationen verwenden, verwenden Sie am Ende BigInteger.

0

Scheint wie in Java 8 some methods are added zu Long alten gut [signiert] lang wie unsigned behandeln. Scheint wie ein Workaround, kann aber manchmal helfen.

4

Für unsigned long können Sie UnsignedLong Klasse von Guava library verwenden:

Es unterstützt verschiedene Operationen:

  • Plus
  • minus
  • mal
  • mod
  • dividedBy

Was im Moment scheinbar fehlt, sind Byte-Shift-Operatoren. Wenn Sie diese benötigen, können Sie BigInteger von Java verwenden.

117

Mit Java 8 wird die Unterstützung für unsigned long (unsigned 64 bit) unterstützt.Die Art und Weise Sie es verwenden können, ist:

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

es zu drucken, können Sie nicht einfach l1 drucken, aber Sie müssen zuerst:

String l1Str = Long.toUnsignedString(l1) 

Dann

System.out.println(l1Str); 
+0

gibt es eine Möglichkeit, wie wir eine unsigned lange aus Scanner – j10

+0

@ j10 lesen konnten, 'Lange ul1 = Long.parseUnsignedLong (objScannerInstance.next (" \\ d + "));' Nicht gerade elegant, weil es einen Bereich fehlt überprüfen Sie, aber es würde Sie lange numerische Eingaben ziehen lassen, die andernfalls den Bereich eines signierten langen überschreiten würden. _ (Nutzt die Tatsache, dass 'Scanner :: next (...)' auch entweder ein Pattern-Objekt oder ein String-Muster akzeptieren kann.) _ – SpencerD

6

Java 8 a liefert Satz von unsigned langen Operationen, mit denen Sie diese Long-Variablen direkt als unsigned behandeln können Long, hier sind einige häufig verwendete:

Und Additionen, Subtraktionen und Multiplikationen sind die gleichen für vorzeichenbehaftete und vorzeichenlose longs.

+1

Ein kurzer Blick in den Quellcode sagt mir, dass ich mit diesen Methoden etwas vorsichtig sein sollte. Wenn die Longs tatsächlich negativ sind (d. H. Es gibt einen Unterschied zu dem Fall mit Vorzeichen), wird die BigInteger-Klasse verwendet. Dies bedeutet, dass bis zu 8 neue BigInteger zugewiesen werden, dies ist eine ganze Menge und definitiv ein Leistungsabfall. – Toonijn

1

Das org.apache.axis.types Paket hat eine

unsignedLong Klasse.

für Maven:

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