Javaの仮想マシンのエンディアン
-
13-09-2019 - |
質問
Javaは、その仮想マシンにはどのようなエンディアンを使用していますか?私はそれが動作しています物理マシンに依存し、私はそれは、私は信じて、常にビッグエンディアンであることを読んだ後、他の場所ことをどこかで読んだ覚えています。どちらが正しいのですか?
解決
class
ファイル内のマルチバイトデータはビッグエンディアンを格納されています。
Java仮想マシン仕様、Java SEの7版<から/>、第4章:class
ファイル形式:
それは複数のバイトにまたがる場合は、クラスファイルは、ストリームで構成されてい 8ビットバイト。すべての16ビット、32ビット、および 64ビット量はによって構成されています 2、4、および8に読んで それぞれの連続する8ビットバイト、。 マルチバイトのデータ項目は、常に保存されています ビッグエンディアン順で、どこ高いです バイトが最初に来ます。
また、バイトコード命令のオペランドも、ビッグエンディアンである。
Java仮想マシン仕様、Java SEの7版<から/>、 2.11:命令セット要約するます:
オペランドがバイト以上である場合 サイズは、それはビッグエンディアンに格納され オーダー上位バイトが最初。ために 例えば、符号なしの16ビットのインデックスに ローカル変数は、二つとして格納されています 符号なしバイト、
byte1
とbyte2
、など その値は(byte1 << 8) | byte2
であること。
そうです、私はJava仮想マシンがビッグエンディアンを使用していると言うことができると思います。
他のヒント
実行中のプロセスに格納された実際の作業データは、ほぼ確実に実行するプロセスのエンディアンと一致します。 (クラスファイルを含む)は、一般的なファイル形式は、ネットワーク順(ビッグエンディアン)になります。
それは仮想マシンによって抽象化されたとしてこれは、機械が下に行っていることを伝えるために、一般的に困難です。あなたがCやC ++でできるようshort[]
するbyte[]
をキャストすることはできません。 java.nio.ByteOrder.nativeOrder() のはあなたの根本的なエンディアンを与える必要があります。非バイトNIOバッファを使用するときにエンディアンをマッチングすると便利です。