Java は仮想マシンでどのエンディアンを使用しますか? それが実行されている物理マシンに依存することをどこかで読んだことを覚えています。そして、それは常にビッグエンディアンであると私が読んだ他の場所を読んだことを覚えています。どちらが正しい?
2 に答える
ファイル内のマルチバイト データは、class
ビッグ エンディアンで格納されます。
Java Virtual Machine Specification, Java SE 7 Edition、Chapter 4: The class
File Formatから:
クラス ファイルは、8 ビット バイトのストリームで構成されます。すべての 16 ビット、32 ビット、および 64 ビットの量は、それぞれ 2、4、および 8 つの連続する 8 ビット バイトを読み取ることによって構築されます。マルチバイト データ項目は常にビッグ エンディアン順で格納され、上位バイトが最初になります。
さらに、バイトコード命令のオペランドも、複数のバイトにまたがる場合はビッグ エンディアンです。
Java Virtual Machine Specification, Java SE 7 Edition、セクション 2.11: Instruction Set Summaryから:
オペランドのサイズが 1 バイトを超える場合は、最初にビッグ エンディアン順の上位バイトに格納されます。たとえば、ローカル変数への符号なし 16 ビット インデックスは、2 つの符号なしバイト
byte1
およびとして格納されbyte2
、その値は になり(byte1 << 8) | byte2
ます。
そうです、Java仮想マシンはビッグエンディアンを使用していると言えると思います。
実行中のプロセスに保存されている実際の作業データは、実行中のプロセスのエンディアンとほぼ確実に一致します。通常、ファイル形式(クラスファイルを含む)はネットワーク順(ビッグエンディアン)になります。
仮想マシンによって抽象化されるため、マシンがその下で何をしているのかを判断するのは一般的に困難です。CおよびC++の場合のように、short[]
をキャストすることはできません。java.nio.ByteOrder.nativeOrder()は、基礎となるエンディアンを提供する必要があります。エンディアンのマッチングは、バイト以外のNIOバッファーを使用する場合に役立ちます。byte[]