5

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 は、sipush 14 ではなく bipush 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)
4

1 に答える 1

8

(概念的に) JVM スタック上のデータの最小単位は 32 ビットであるためです。したがって、8 ビットだけでスタックのサイズを増やす方法はありません。

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

任意の時点で、オペランド スタックには関連付けられた深度があり、long または double 型の値は深さに 2 単位寄与し、その他の型の値は 1 単位寄与します。

于 2013-08-27T15:31:30.577 に答える