java字节码的不同行为

java字节码的不同行为,java,bytecode,Java,Bytecode,我是Java字节码的新手。我通过一些示例理解字节码,但我被困在了一个示例中。 这些是我的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); } } Compil

我是Java字节码的新手。我通过一些示例理解字节码,但我被困在了一个示例中。
这些是我的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

}  
类simpledd{
公共静态void main(字符参数[]){
INTA、b、c、d;
a=9;
b=4;
c=3;
d=a+b+c;
系统输出打印ln(d);
}
}  
从“simpledd.java”编译而来
类simpledd扩展了java.lang.Object{
simplead();
代码:
0:aload_0
1:invokespecial#1;//方法java/lang/Object。“:()V
4:返回
公共静态void main(char[]);
代码:
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;//字段java/lang/System.out:Ljava/io/PrintStream;
17:iload 4
19:invokevirtual#3;//方法java/io/PrintStream.println:(I)V
22:返回
}  
我只是想知道,当我们有指令a=9时,为什么会有bipush 9

在所有其他情况下都存在iconst。

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

bipush
可以将常量值推到-128和127之间。它是一个双字节指令


要按9键,不能使用
iconst
。没有iconst_9指令。

没有iconst_9指令


没有
iconst_9
,因此您必须使用等效的(但效率较低的)
bipush
i_const指令的范围仅为0~5,因此它必须通过推送和存储来吐出指令

对iconst*指令进行了优化,以在bipush时使用较小且特定的数字(将字节作为整数值推送到堆栈上)适用于较大的数字。

没有
iconst_9
指令。因此,要按9,不能使用iconst。必须按
bipush
bipush 9
将整数文本9按入堆栈。
istore_1
将该值存储到局部变量#1。
iconst_4
将文本4按入堆栈,然后对于
bipush
,它是一个字节还是两个字节,但是只有
iconst_1
iconst_5
字节码——没有
iconst_9
iconst
支持值…