404 Stimmen

Deklaration eines unsigned int in Java

Gibt es eine Möglichkeit, einen unsigned int in Java zu deklarieren?

Die Frage kann aber auch so formuliert werden: Was ist die Java-Entsprechung von unsigned?

Um Ihnen den Kontext zu verdeutlichen, habe ich mir die Java-Implementierung von String.hashcode() . Ich wollte die Möglichkeit der Kollision zu testen, wenn die ganze Zahl 32 unsigned int waren.

392voto

Simeon Visser Punkte 115081

Java verfügt nicht über einen Datentyp für ganze Zahlen ohne Vorzeichen .

Sie können eine long anstelle eines int wenn Sie große Werte speichern müssen.

Sie können eine Ganzzahl mit Vorzeichen auch so verwenden, als wäre sie vorzeichenlos. Der Vorteil von Zweierkomplementdarstellung ist, dass die meisten Operationen (wie Addition, Subtraktion, Multiplikation und Linksverschiebung) auf binärer Ebene für ganze Zahlen mit und ohne Vorzeichen identisch sind. Einige wenige Operationen (Division, Rechtsverschiebung, Vergleich und Casting) sind jedoch unterschiedlich. Ab Java SE 8 gibt es neue Methoden in der Integer Klasse ermöglichen Ihnen die vollständige Nutzung der int Datentyp zur Durchführung von Arithmetik ohne Vorzeichen :

In Java SE 8 und höher können Sie den Datentyp int verwenden, um eine 32-Bit-Ganzzahl ohne Vorzeichen darzustellen, die einen Mindestwert von 0 und einen Höchstwert von 2^32-1 hat. Verwenden Sie die Klasse Integer, um den Datentyp int als Ganzzahl ohne Vorzeichen zu verwenden. Statische Methoden wie compareUnsigned , divideUnsigned usw. wurden der Klasse Integer hinzugefügt, um die arithmetischen Operationen für ganze Zahlen ohne Vorzeichen zu unterstützen.

Beachten Sie, dass int Variablen sind bei der Deklaration immer noch vorzeichenbehaftet, aber vorzeichenlose Arithmetik ist jetzt möglich, indem man diese Methoden in der Integer Klasse.

85voto

Zsolt Safrany Punkte 12660

Ob ein Wert in einem int vorzeichenbehaftet oder vorzeichenlos ist, hängt davon ab, wie die Bits interpretiert werden - Java interpretiert Bits als vorzeichenbehaftete Werte (es gibt keine vorzeichenlosen Primitive).

Wenn Sie einen int-Wert haben, den Sie als Wert ohne Vorzeichen interpretieren wollen (z. B. wenn Sie einen int-Wert aus einer DataInputStream von dem Sie wissen, dass er als Wert ohne Vorzeichen interpretiert werden sollte), können Sie den folgenden Trick anwenden.

int fourBytesIJustRead = someObject.getInt();
long unsignedValue = fourBytesIJustRead & 0xffffffffL;

Wichtig ist, dass das Hex-Literal ein Long-Literal und kein Int-Literal ist - daher das "L" am Ende.

28voto

Lukas Eder Punkte 194234

Wir brauchten vorzeichenlose Zahlen, um die vorzeichenlosen Zahlen von MySQL zu modellieren TINYINT , SMALLINT , INT , BIGINT en jOOQ Deshalb haben wir jOOU eine minimalistische Bibliothek mit Wrapper-Typen für vorzeichenlose Ganzzahlen in Java. Beispiel:

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 erweitern java.lang.Number und können in primitive Typen höherer Ordnung umgewandelt werden und BigInteger . Ich hoffe, das hilft.

(Haftungsausschluss: Ich arbeite für das Unternehmen, das hinter diesen Bibliotheken steht)

9voto

Andrejs Punkte 25249

Für vorzeichenlose Zahlen können Sie diese Klassen aus Guava-Bibliothek :

Sie unterstützen verschiedene Operationen:

  • plus
  • minus
  • mal
  • mod
  • geteiltDurch

Was im Moment zu fehlen scheint, sind Byte-Shift-Operatoren. Wenn Sie diese benötigen, können Sie BigInteger aus Java verwenden.

5voto

Matthias Ronge Punkte 8421

Vielleicht haben Sie genau das gemeint?

long getUnsigned(int signed) {
    return signed >= 0 ? signed : 2 * (long) Integer.MAX_VALUE + 2 + signed;
}
  • getUnsigned(0) 0
  • getUnsigned(1) 1
  • getUnsigned(Integer.MAX_VALUE) 2147483647
  • getUnsigned(Integer.MIN_VALUE) 2147483648
  • getUnsigned(Integer.MIN_VALUE + 1) 2147483649

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X