Java implizite Umwandlung von int in byte

Ich bin dabei, an etwas zu arbeiten, das das Lesen von Bytes und das Erstellen von Strings erfordert. Die gelesenen Bytes repräsentieren UTF-16-Strings. Um dies zu testen, wollte ich ein einfaches Byte-Array in UTF-16-Codierung in einen String konvertieren. Die ersten 2 Bytes im Array müssen die Endianness darstellen und müssen entweder 0xff 0xfe oder 0xfe 0xff sein. Also habe ich versucht, mein Bytearray wie folgt zu erstellen:

byte[] bytes = new byte[] {0xff, 0xfe, 0x52, 0x00, 0x6F, 0x00};

Ich habe jedoch eine Fehlermeldung erhalten, weil 0xFF und 0xFE zu groß sind, um in ein Byte zu passen (weil Bytes in Java signiert sind). Genauer gesagt war der Fehler, dass das int nicht in ein Byte konvertiert werden konnte. Ich weiß, dass ich mit einer Besetzung einfach explizit von int zu byte konvertieren und das gewünschte Ergebnis erzielen könnte, aber darum geht es in meiner Frage nicht.

Um etwas auszuprobieren, habe ich einen String erstellt und getBytes ("UTF-16") aufgerufen und dann jedes der Bytes im Array gedruckt. Die Ausgabe war etwas verwirrend, da die ersten beiden Bytes 0xFFFFFFFE 0xFFFFFFFF gefolgt von 0x00 0x52 0x00 0x6F waren. (Es ist klar, dass die Endianität hier anders ist als das, was ich oben versucht habe, aber das ist nicht wichtig).

Mit dieser Ausgabe habe ich beschlossen, mein Byte-Array auf die gleiche Weise zu erstellen:

byte[] bytes = new byte[] {0xffffffff, 0xfffffffe, 0x52, 0x00, 0x6F, 0x00};

Und seltsamerweise hat es gut funktioniert. Meine Frage ist also, warum Java zulässt, dass ein ganzzahliger Wert von 0xFFFFFF80 oder höher ohne explizite Umwandlung automatisch in ein Byte umgewandelt wird, aber alles, was gleich oder größer als 0x80 ist, erfordert eine explizite Umwandlung?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage