從字節碼看short s=1; s=s+1;和short s=1 s+=1

short s=1; s=s+1;和short s=1  s+=1;這倆個的問題。

第一個不能通過編譯,第二個可以通過編譯。

 short s=1,short y=1; short z=s+y;  也錯的。

public static void main(String[] args) {
short s1=1;
s1+=1;
System.out.println(s1);

}

這是javap出來的

short s1=1;

jvm是這樣執行的,

1,將int型1推送到操作數棧頂,

2,將棧頂的int型數據存入局部變量表

s1+=1;

1.先從局部變量表把s1取出來 也就是iload_1

2,將int型1推送的棧頂

3,iadd:將棧頂倆int型數值相加之後把結果壓入棧頂

4,i2s,int to short:將int類型數值強制轉換成short型,並將結果壓入棧幀

5,istore_1,將棧頂int型數值存入局部變量表第二個變量槽(slot)

後面的就是獲得out對象,再從局部變量表中第二個slot中的int型數據取出來,執行虛方法println(),最後return。

字節碼就只有一個字節,所以它最多有256個,像short這類型的操作就都被int的字節碼代替了。

我們也可以看到+=執行的時候i2s指令執行了。所以可以執行成功。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章