对于将Int型常量压栈的字节码的一些疑问

1.1给出如下代码片段:

1 public static void main(String[] args) {
2     int i = 5;
3     int j = -1;
4 }

其转换为字节码为:

1 public static void main(java.lang.String[]);
2 Code:
3 0: iconst_5
4 1: istore_1
5 2: iconst_m1
6 3: istore_2
7 4: return
8 }

如图所示,

1.1.1 iconst_5

const指令表示将数据推送至栈顶,但是const的范围非常小,仅包括:

int: -1 ~ 5long , double: 0 ~ 1 , float: 0 ~ 2

对于更大的数,则是采用bipush , sipush , idc指令进行操作。这么做的原因是为什么?

一开始想的是操作更少位的寄存器比如从RAX改为EAX甚至更小的寄存器。后来查看汇编的时候发现iconst操作的还是RAX,所以字节码区分iconst,bipush , sipush , idc的意义是什么?具体好处在哪?

有没有老哥给解答一下,不胜感激!


看看这个吧

iconst,bipush , sipush , ldc 这些指令是定义的取值范围使用哪些指令;例如你上大学之后,学校给的学号一般都是年开头的,这样老师看到你的学号就知道你是哪一年入学的,就知道你的大概范围;然后不同的系别,也有给到不同的编号,就知道你是哪个系的;