java字节码的不同行为

我是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."":()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指令时为什么会有bipush 9
在所有其他情况下,有iconst。

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

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

要推9,你不能使用iconst 。 没有iconst_9指令。

iconst_n定义为0从0到5

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

没有iconst_9指令

i_const指令的范围仅为0~5,因此必须通过push和store吐出实例

指令iconst_ *经过优化,可以处理小的和特定的数字,而bipush(将一个字节作为整数值推入堆栈)适用于更大的数字。

没有iconst_9指令。 所以要推9你不能使用iconst。 你必须去bipush