java字节码的不同行为

时间:2012-08-04 20:25:45

标签: java bytecode

我是Java Bytecode的新手。我通过一些例子理解了字节码,但是我被困在一个例子中 这些是我的java和字节码文件

class SimpleAdd{
    public static void main(char args[]){
        int a,b,c,d;
        a = 9;
        b = 4;
        c = 3;
        d = a + b + c;
        System.out.println(d);
    }
}  
Compiled from "SimpleAdd.java"
class SimpleAdd extends java.lang.Object{
SimpleAdd();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(char[]);
  Code:
   0:   bipush  9
   2:   istore_1
   3:   iconst_4
   4:   istore_2
   5:   iconst_3
   6:   istore_3
   7:   iload_1
   8:   iload_2
   9:   iadd
   10:  iload_3
   11:  iadd
   12:  istore  4
   14:  getstatic   #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   17:  iload   4
   19:  invokevirtual   #3; //Method java/io/PrintStream.println:(I)V
   22:  return

}  

我只想知道为什么当我们有指令a = 9时有双推9 而在所有其他情况下都有iconst。

6 个答案:

答案 0 :(得分:22)

iconst可以将常量值-1推送到5.这是一个单字节指令。

bipush可以在-128到127之间推送常量值。这是一个双字节指令。

要按9,您无法使用iconst。没有iconst_9指令。

答案 1 :(得分:6)

iconst_n is defined for n from 0 to 5

没有iconst_9,所以你必须使用等效的(但效率较低)bipush

答案 2 :(得分:0)

没有iconst_9指令

答案 3 :(得分:0)

i_const指令的范围仅为0~5,因此必须通过推送和存储来吐出指令

答案 4 :(得分:0)

icont_ *指令经过优化,可使用较小的特定数字,而bipush(将一个字节作为整数值压入堆栈)则适用于较大的数字。

答案 5 :(得分:0)

没有iconst_9指令。因此,要推送9,您不能使用iconsst。您必须参加bipush