Auch wenn es zu spät ist, möchte ich meine Meinung dazu abgeben, da dies möglicherweise klarstellt, warum die von JB Nizet gegebene Lösung funktioniert. Ich bin auf dieses kleine Problem gestoßen, als ich an einem Byte-Parser arbeitete und die String-Konvertierung selbst durchführte. Wenn Sie von einem größeren Integraltyp in einen kleineren Integraltyp kopieren, wie in diesem Java-Dokument angegeben, geschieht Folgendes:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.3 Bei
einer engeren Konvertierung einer vorzeichenbehafteten Ganzzahl in einen integralen Typ T werden einfach alle außer dem n niedrigsten verworfen Ordnungsbits, wobei n die Anzahl der Bits ist, die zur Darstellung des Typs T verwendet werden. Zusätzlich zu einem möglichen Informationsverlust über die Größe des numerischen Werts kann dies dazu führen, dass das Vorzeichen des resultierenden Werts vom Vorzeichen des Eingabewerts abweicht .
Sie können sicher sein, dass ein Byte ein integraler Typ ist, da in diesem Java-Dokument
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
Byte angegeben ist: Der Byte-Datentyp ist ein 8-Bit-Zwei mit Vorzeichen Komplement Ganzzahl.
Wenn Sie also eine Ganzzahl (32 Bit) in ein Byte (8 Bit) umwandeln, kopieren Sie einfach die letzten (niedrigstwertigen 8 Bit) dieser Ganzzahl in die angegebene Bytevariable.
int a = 128;
byte b = (byte)a; // Last 8 bits gets copied
System.out.println(b); // -128
Im zweiten Teil der Geschichte geht es darum, wie unäre und binäre Java-Operatoren Operanden fördern.
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2 Die
Erweiterung der primitiven Konvertierung (§5.1.2) wird angewendet, um einen oder beide Operanden wie angegeben zu konvertieren nach folgenden Regeln:
Wenn einer der Operanden vom Typ double ist, wird der andere in double konvertiert.
Wenn einer der Operanden vom Typ float ist, wird der andere in float konvertiert.
Wenn einer der Operanden vom Typ long ist, wird der andere in long konvertiert.
Andernfalls werden beide Operanden in den Typ int konvertiert.
Seien Sie versichert, wenn Sie mit dem integralen Typ int und / oder niedriger arbeiten, wird dieser zu einem int heraufgestuft.
// byte b(0x80) gets promoted to int (0xFF80) by the & operator and then
// 0xFF80 & 0xFF (0xFF translates to 0x00FF) bitwise operation yields
// 0x0080
a = b & 0xFF;
System.out.println(a); // 128
Ich habe mir auch den Kopf darüber gekratzt :). Hier gibt es eine gute Antwort von rgettman.
Bitweise Operatoren in Java nur für Integer und Long?