为什么jvm在推送堆栈之前将byte&short扩展为int?

Pra*_*eek 4 java byte jvm bytecode short

java代码:,

byte a_b = 12;
short c_d = 14
Run Code Online (Sandbox Code Playgroud)

用字节码替换

bipush  12 // expands byte1 (a byte type) to an int and pushes it onto the stack
sipush   14 // expands byte1, byte2 (a short type) to an int and pushes it onto the stack
Run Code Online (Sandbox Code Playgroud)

为什么jvm会进行扩展,而不是使用byte和short?

当我打开我的文件的字节码时

编辑:short var = 14被bipush 14取代而不是sipush 14

我的理解不清楚还是有错误?

在此输入图像描述

我正在使用以下版本

java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) Client VM (build 20.1-b02, mixed mode, sharing)
Run Code Online (Sandbox Code Playgroud)

Lar*_*off 6

因为(概念上)JVM堆栈上的最小数据单元是32位.所以没有办法只用8位增加堆栈的大小.

http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.6.2

在任何时间点,操作数堆栈都具有相关联的深度,其中long或double类型的值对深度贡献两个单位,而任何其他类型的值贡献一个单位.