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指令執行了。所以可以執行成功。