Java 为什么jvm扩展字节&;在推堆栈之前短到int?

Java 为什么jvm扩展字节&;在推堆栈之前短到int?,java,jvm,byte,bytecode,short,Java,Jvm,Byte,Bytecode,Short,java代码: byte a_b = 12; short c_d = 14 将字节码中的替换为 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 为什么jvm进行这种扩展,而不使用byte&short 当

java代码:

byte a_b = 12;
short c_d = 14
将字节码中的替换为

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
为什么jvm进行这种扩展,而不使用byte&short

当我打开文件的字节码时也是如此

EDIT: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)
因为(概念上)JVM堆栈上的最小数据单元是32位。因此,没有办法仅用8位来增加堆栈的大小

在任何时间点,操作数堆栈都具有关联的深度,其中 “long”或“double”类型的值为深度和深度提供两个单位 任何其他类型的值贡献一个单位


看,主要是因为他们是这样定义的,没有必要对它进行不同的定义。(从概念上讲,堆栈仅以4字节的增量递增/递减,尽管在8字节JVM中显然必须发生一点踢踏舞。)bipush的长度为2字节,而sipush的长度为3字节。为什么要使用较长的指令,而较短的指令也可以工作?@HotLicks看到下面链接中添加的快照,您的意思是“在任何时间点,操作数堆栈都有一个相关的深度,其中long或double类型的值为深度贡献两个单位,而任何其他类型的值为深度贡献一个单位。”?我想您的意思是减少;-)此外,您只能将8位数据写入32位堆栈帧。我只是在浪费空间。我认为真正的原因可以在答案中找到。@TheTerribleSwiftTomato在注释中链接了。@stonedsquirrel-他们确实将8位数据写入32位堆栈帧。然后符号延伸到画面的其余部分。@HotLicks当然了。我没想到,你不仅可以做到,而且必须使用固定的堆栈帧大小;-)谢谢