Niejawna konwersja języka Java na bajt

Już zaczynam pracować nad czymś, co wymaga czytania bajtów i tworzenia ciągów. Odczytywane bajty reprezentują ciągi UTF-16. Aby przetestować rzeczy, chciałem przekonwertować prostą tablicę bajtów w kodowaniu UTF-16 na ciąg znaków. Pierwsze 2 bajty w tablicy muszą reprezentować endianness, a więc muszą być 0xff 0xfe lub 0xfe 0xff. Próbowałem więc utworzyć moją tablicę bajtów w następujący sposób:

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

Ale dostałem błąd, ponieważ 0xFF i 0xFE są zbyt duże, aby zmieścić się w bajcie (ponieważ bajty są podpisane w Javie). Dokładniej błąd polegał na tym, że int nie mógł zostać przekonwertowany na bajt. Wiem, że mogłem wprost przekonwertować z int na bajt z obsadą i osiągnąć pożądany rezultat, ale nie o to mi chodzi.

Aby wypróbować coś, stworzyłem String i wywołałem getBytes („UTF-16”), a następnie wydrukowałem każdy bajt w tablicy. Wyjście było nieco mylące, ponieważ pierwsze dwa bajty były 0xFFFFFFFE 0xFFFFFFFF, a następnie 0x00 0x52 0x00 0x6F. (Widocznie endianność tutaj różni się od tego, co próbowałem stworzyć powyżej, ale to nie jest ważne).

Korzystając z tego wyjścia, postanowiłem spróbować utworzyć moją tablicę bajtów w ten sam sposób:

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

I co dziwne, działało dobrze. Tak więc moje pytanie brzmi: dlaczego Java zezwala na automatyczną konwersję wartości całkowitej 0xFFFFFF80 lub większej na bajt bez wyraźnego rzutowania, ale wszystko co równe lub większe niż 0x80 wymaga wyraźnego rzutowania?

questionAnswers(5)

yourAnswerToTheQuestion