web-dev-qa-db-ja.com

Javaの仮想マシンのエンディアン

Java仮想マシンで使用するエンディアンは何ですか?実行している物理マシンに依存することをどこかで読んだことを覚えています。それから、私が読んだ他の場所では、常に大きいと思います。エンディアン。どちらが正しいですか?

30
JoeCool

classファイルのマルチバイトデータはビッグエンディアンで保存されます。

から Java仮想マシン仕様、Java SE 7 Edition第4章:classファイル形式

クラスファイルは、8ビットバイトのストリームで構成されます。すべての16ビット、32ビット、および64ビットの量は、それぞれ2、4、および8つの連続する8ビットバイトを読み取ることによって構築されます。マルチバイトデータ項目は常にビッグエンディアンの順序で格納され、上位バイトが最初になります。

さらに、バイトコード命令のオペランドも、複数のバイトにまたがる場合はビッグエンディアンになります。

から Java仮想マシン仕様、Java SE 7 Editionセクション2.11:命令セットの概要

オペランドのサイズが複数バイトの場合、上位バイトから上位バイトの順に格納されます。たとえば、ローカル変数への符号なし16ビットインデックスは、値がbyte1になるように、2つの符号なしバイトbyte2(byte1 << 8) | byte2として格納されます。

そうです、Java仮想マシンはビッグエンディアンを使用していると言えます。

31
coobird

実行中のプロセスに保存されている実際の作業データは、実行中のプロセスのエンディアンとほぼ確実に一致します。通常、ファイル形式(クラスファイルを含む)はネットワーク順(ビッグエンディアン)になります。

仮想マシンによって抽象化されるため、マシンがその下で何をしているのかを判断するのは一般的に困難です。 CおよびC++の場合のように、short[]byte[]にキャストすることはできません。 Java.nio.ByteOrder.nativeOrder() は、根底にあるエンディアンを提供するはずです。エンディアンのマッチングは、バイト以外のNIOバッファーを使用する場合に役立ちます。

18