バイトの読み取りと文字列の作成が必要な作業を開始しようとしています。読み取られるバイトは UTF-16 文字列を表します。そこで、テストするために、UTF-16 エンコーディングの単純なバイト配列を文字列に変換したいと考えました。配列の最初の 2 バイトはエンディアンを表す必要があるため、0xff 0xfe または 0xfe 0xff のいずれかでなければなりません。そこで、次のようにバイト配列を作成してみました。
byte[] bytes = new byte[] {0xff, 0xfe, 0x52, 0x00, 0x6F, 0x00};
しかし、0xFF と 0xFE が大きすぎて 1 バイトに収まらないため (バイトは Java で署名されているため)、エラーが発生しました。より正確には、エラーは int をバイトに変換できなかったことです。キャストを使用して int から byte に明示的に変換し、目的の結果を得ることができることはわかっていますが、それは私の質問ではありません。
何かを試すために、String を作成して getBytes("UTF-16") を呼び出し、配列内の各バイトを出力しました。最初の 2 バイトが 0xFFFFFFFE 0xFFFFFFFF であり、その後に 0x00 0x52 0x00 0x6F が続くため、出力は少し混乱しました。(明らかに、ここでのエンディアンは、上で作成しようとしていたものとは異なりますが、それは重要ではありません)。
この出力を使用して、同じ方法でバイト配列を作成してみることにしました。
byte[] bytes = new byte[] {0xffffffff, 0xfffffffe, 0x52, 0x00, 0x6F, 0x00};
そして奇妙なことに、それはうまくいきました。だから私の質問は、Java が明示的なキャストなしで 0xFFFFFF80 以上の整数値を自動的にバイトに変換できるのはなぜですか?