Konvertiert vorzeichenloses Byte in vorzeichenbehaftetes Byte

8

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?

    
Joeblackdev 06.08.2011, 11:44
quelle

5 Antworten

9

Java hat keine vorzeichenlosen Werte außer für char . Betrachten Sie dieses Snippet:

%Vor%

Das Ergebnis ist -1, weil die niedrigsten 8 Bits in die Byte-Variable kopiert wurden.

    
Tassos Bassoukos 06.08.2011, 11:50
quelle
25

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:

%Vor%

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.

    
ostefano 06.08.2011 11:50
quelle
6
%Vor%

sollte die Arbeit machen.

    
Piotr De 06.08.2011 11:52
quelle
3

So speichern und konvertieren Sie einen vorzeichenlosen Byte-Wert:

%Vor%

Wenn du b auf int wirfst, passiert Folgendes:

%Vor%

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:

%Vor%

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.

%Vor%

Unser ursprünglicher Wert von 144 wurde wiederhergestellt und kann sicher in ein Byte zurückversetzt werden:

%Vor%     
donturner 18.08.2015 14:50
quelle
2

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.

    
Peter Lawrey 06.08.2011 12:11
quelle

Tags und Links