14

私はJavaバイトコードを学ぼうとしていますが、これに遭遇しました。次の-gオプションを使用して、この非常に単純なコードをコンパイルしました。

public class Test
{
 public static void main(String args[])
 {
  double a = 1.0;
  int b = (int)a;
 }
}

メインコードは次のようになりました:

0 dconst_1
1 dstore_1
2 dload_1
3 d2i
4 istore_3
5 return

さらに、mainの最大ローカル変数は4であり、LocalVariableTableには3つのエントリ(args、a、b)しかありません。コンパイラが4つのローカル変数を予約したのに、明らかに3つしかlocalvariable[2]なく、使用されていない理由を知りたいです。足りないものはありますか?ありがとうございました

4

2 に答える 2

25

longとdoubleがフレーム内の2つの連続したエントリを占めるため、4になります。これは、JavaJVM仕様で明確に指定されています。

long型またはdouble型の値は、2つの連続するローカル変数を占有します。このような値は、小さい方のインデックスを使用してのみ対処できます。たとえば、インデックスnのローカル変数配列に格納されているdouble型の値は、実際にはインデックスnおよびn+1のローカル変数を占有します。ただし、インデックスn+1のローカル変数はからロードできません。に保存できます。ただし、これを行うと、ローカル変数nの内容が無効になります。

于 2009-11-21T09:27:33.673 に答える
4

私はJavaバイトコードを知りません、これは単なる推測です:

それはという事実と関係aがあるのdoubleでしょうか?2つの単語が予約されていますか?

于 2009-11-21T09:22:26.430 に答える