In der Oracle „Primitive Datentypen“ Seite , erwähnt sie , dass Java 8 Unterstützung für unsigned ints und sehnt sich fügt hinzu:
int
: Standardmäßig ist derint
Datentyp eine 32-Bit-Zweierkomplement-Ganzzahl mit Vorzeichen, die einen Minimalwert von –2 31 und einen Maximalwert von 2 31 –1 hat. In Java SE 8 und höher können Sie denint
Datentyp verwenden, um eine vorzeichenlose 32-Bit-Ganzzahl darzustellen, die einen Minimalwert von 0 und einen Maximalwert von 2 32 −1 hat. Verwenden Sie dieInteger
Klasse, um denint
Datentyp als Ganzzahl ohne Vorzeichen zu verwenden. Weitere Informationen finden Sie im Abschnitt Die Zahlenklassen. Statische Methoden wiecompareUnsigned
,divideUnsigned
etc wurden die hinzugefügtInteger
Klasse , um die arithmetischen Operationen für ganze Zahlen ohne Vorzeichen zu unterstützen.
long
: Derlong
Datentyp ist eine 64-Bit-Zweierkomplement-Ganzzahl. Das Vorzeichenlong
hat einen Minimalwert von −2 63 und einen Maximalwert von 2 63 −1. In Java SE 8 und höher können Sie denlong
Datentyp verwenden, um ein vorzeichenloses 64-Bit darzustellenlong
, das einen Mindestwert von 0 und einen Höchstwert von 2 64 −1 hat. Verwenden Sie diesen Datentyp, wenn Sie einen Wertebereich benötigen, der breiter ist als der von int bereitgestellte. DieLong
Klasse enthält auch Methoden wiecompareUnsigned
,divideUnsigned
etc arithmetische Operationen für unsigned zu unterstützenlong
.
Ich finde jedoch keine Möglichkeit, ein vorzeichenloses Long oder eine Ganzzahl zu deklarieren. Der folgende Code gibt beispielsweise eine Compiler-Fehlermeldung aus: "Das Literal liegt außerhalb des Bereichs" (ich verwende natürlich Java 8), wenn es im Bereich liegen sollte (der zugewiesene Wert ist genau 2 64 −1). ::
public class Foo {
static long values = 18446744073709551615L;
public static void main(String[] args){
System.out.println(values);
}
}
Gibt es also eine Möglichkeit, ein Int oder Long ohne Vorzeichen zu deklarieren?
Antworten:
Gemäß der von Ihnen veröffentlichten Dokumentation und diesem Blog-Beitrag gibt es keinen Unterschied, wenn Sie das Grundelement zwischen einem nicht signierten int / long und einem signierten deklarieren. Die "neue Unterstützung" ist das Hinzufügen der statischen Methoden in den Klassen Integer und Long, z . B. Integer.divideUnsigned . Wenn Sie diese Methoden nicht verwenden, ist Ihr "vorzeichenloses" Long über 2 ^ 63-1 nur ein einfaches altes Long mit einem negativen Wert.
Nach einem kurzen Blick sieht es nicht so aus, als gäbe es eine Möglichkeit, ganzzahlige Konstanten im Bereich außerhalb von +/- 2 ^ 31-1 oder +/- 2 ^ 63-1 für Longs zu deklarieren. Sie müssten den negativen Wert, der Ihrem positiven Wert außerhalb des Bereichs entspricht, manuell berechnen.
quelle
Nun, selbst in Java 8
long
undint
immer noch signiert, behandeln sie nur einige Methoden so , als wären sie nicht signiert . Wenn Sie so ein vorzeichenloseslong
Literal schreiben möchten , können Sie dies tunstatic long values = Long.parseUnsignedLong("18446744073709551615"); public static void main(String[] args) { System.out.println(values); // -1 System.out.println(Long.toUnsignedString(values)); // 18446744073709551615 }
quelle
// Java 8 int vInt = Integer.parseUnsignedInt("4294967295"); System.out.println(vInt); // -1 String sInt = Integer.toUnsignedString(vInt); System.out.println(sInt); // 4294967295 long vLong = Long.parseUnsignedLong("18446744073709551615"); System.out.println(vLong); // -1 String sLong = Long.toUnsignedString(vLong); System.out.println(sLong); // 18446744073709551615 // Guava 18.0 int vIntGu = UnsignedInts.parseUnsignedInt(UnsignedInteger.MAX_VALUE.toString()); System.out.println(vIntGu); // -1 String sIntGu = UnsignedInts.toString(vIntGu); System.out.println(sIntGu); // 4294967295 long vLongGu = UnsignedLongs.parseUnsignedLong("18446744073709551615"); System.out.println(vLongGu); // -1 String sLongGu = UnsignedLongs.toString(vLongGu); System.out.println(sLongGu); // 18446744073709551615 /** Integer - Max range Signed: From −2,147,483,648 to 2,147,483,647, from −(2^31) to 2^31 – 1 Unsigned: From 0 to 4,294,967,295 which equals 2^32 − 1 Long - Max range Signed: From −9,223,372,036,854,775,808 to 9,223,372,036,854,775,807, from −(2^63) to 2^63 − 1 Unsigned: From 0 to 18,446,744,073,709,551,615 which equals 2^64 – 1 */
quelle
Es gibt keine Möglichkeit , ein Long oder Int ohne Vorzeichen in Java 8 oder Java 9 zu deklarieren. Einige Methoden behandeln sie jedoch so, als wären sie ohne Vorzeichen, zum Beispiel:
static long values = Long.parseUnsignedLong("123456789012345678");
Dies ist jedoch keine Deklaration der Variablen.
quelle
Wenn die Verwendung einer Bibliothek eines Drittanbieters eine Option ist, gibt es jOOU (eine Spin-off-Bibliothek von jOOQ ), die Wrapper-Typen für vorzeichenlose Ganzzahlen in Java bietet. Das ist nicht genau das Gleiche wie die Unterstützung von primitiven Typen (und damit Bytecode) für vorzeichenlose Typen, aber vielleicht ist es immer noch gut genug für Ihren Anwendungsfall.
import static org.joou.Unsigned.*; // and then... UByte b = ubyte(1); UShort s = ushort(1); UInteger i = uint(1); ULong l = ulong(1);
Alle diese Typen erstrecken sich
java.lang.Number
und können in primitive Typen höherer Ordnung und konvertiert werdenBigInteger
.(Haftungsausschluss: Ich arbeite für die Firma hinter diesen Bibliotheken)
quelle