Gibt es eine einfache und elegante Möglichkeit, einen vorzeichenlosen Byte-Wert in einen vorzeichenbehafteten Byte-Wert in Java zu konvertieren? Wenn zum Beispiel alles, was ich habe, der int-Wert 240 ist (in binär (24 Bits + 11110000) = 32 Bits), wie kann ich den vorzeichenbehafteten Wert für dieses int erhalten?
Java hat keine vorzeichenlosen Werte außer für char
. Betrachten Sie dieses Snippet:
Das Ergebnis ist -1, weil die niedrigsten 8 Bits in die Byte-Variable kopiert wurden.
In Java sind alle primitiven Typen, mit Ausnahme von char
, signiert. Sie können kein Byte ohne Vorzeichen haben.
Die einzige Sache, die Sie tun können, ist, das vorzeichenlose Byte zu einem int zu werfen, damit Sie seinen korrekten Wert lesen können:
Wenn Sie einen vorzeichenlosen Byte-Wert in einem Byte-Typ speichern möchten, können Sie das natürlich, aber jedes Mal, wenn Sie es "verarbeiten" müssen, denken Sie daran, es erneut zu generieren, wie oben gezeigt.
So speichern und konvertieren Sie einen vorzeichenlosen Byte-Wert:
%Vor% Wenn du b
auf int
wirfst, passiert Folgendes:
Ausgabe:
%Vor% Warum passiert das? Bytes sind in Java signiert und b
ist negativ, so dass die Cast-Operation den resultierenden int mit 1s von links füllt. Mehr zu Java-Datenformaten .
Wie kommen wir also von -112 zum richtigen Wert von 144 zurück? Wir benötigen eine 32-bit Bitmaske , die wir mit int
erstellen können:
Nun können wir den bitweisen Operator &
verwenden, um die 24 Bits der letzten 24 Bits "auf Null zu setzen", wobei nur die ursprünglichen 8 Bits übrig bleiben.
Unser ursprünglicher Wert von 144 wurde wiederhergestellt und kann sicher in ein Byte zurückversetzt werden:
%Vor%Java unterstützt nur signierte Bytes. Wenn Sie also einen Wert in ein Byte setzen, wird davon ausgegangen, dass er signiert ist.
%Vor%Wenn Sie jedoch ein Byte ohne Vorzeichen speichern möchten, müssen Sie dies selbst erledigen. (d. h. Java unterstützt es nicht, aber Sie können es tun)
Bei Operationen wie +, -, *, & lt; & lt;, & gt; & gt; & gt ;, ==,! =, ~ müssen Sie nichts ändern. Für Operationen wie & lt ;, & gt; Sie müssen kleinere Anpassungen vornehmen, und für Operationen wie /,% müssen Sie einen größeren Datentyp verwenden.
Eine häufig verwendete Alternative ist die Verwendung eines größeren Datentyps wie int
, um die Werte 0 - 255 zu speichern. Das hat keinen großen Nachteil.