[英]JVM instructions - sload
我想這是一個基本問題,但是為什么沒有sload指令? 為什么您可以加載除short之外的所有基元? (有saload ,但仍然...)
對於:
public class ShortTest {
public void test() {
short i = 1;
System.out.print(i);
}
}
編譯器仍使用iload_1 。 是因為16位類型短而處理器能處理更好的32位(因為所有現代處理器都是32/64位)?
請參閱JVM規范§2.11.1。 類型和Java虛擬機 :
請注意, 表2.11.1-A中的大多數指令都沒有整數類型
byte
,char
和short
。 沒有一個具有boolean
類型的形式。 編譯器使用Java虛擬機指令對byte
和short
類型的文字值的負載進行編碼,這些指令在編譯時或運行時將這些值符號擴展為int
類型的值。 使用boolean
和char
類型的文字值的加載使用指令進行編碼,這些指令在編譯時或運行時將文字零擴展為int
類型的值。 同樣,使用Java虛擬機指令對boolean
,byte
,short
和char
類型的值數組中的負載進行編碼,這些指令將這些值進行符號擴展或零擴展為int
類型的值。 因此,對實際類型為boolean
,byte
,char
和short
值的大多數操作都由對計算類型為int
值的指令正確執行。
值得回顧的是,在Java中,任何不涉及long
整數運算都將具有int
結果,而不管輸入是byte
, char
, short
還是int
。
所以像
short i = 1, j = 2, k = i + j;
不會編譯,但需要類型轉換,例如
short i = 1, j = 2, k = (short)(i + j);
而這種類型轉換將是唯一涉及short
指標。 放開調試提示,字節碼中沒有正式的局部變量聲明,只有確定其類型的值賦值。 因此, short
類型的局部變量根本不存在。 上面的代碼編譯為
0: iconst_1
1: istore_1
2: iconst_2
3: istore_2
4: iload_1
5: iload_2
6: iadd
7: i2s
8: istore_3
這與的編譯形式相同
int i = 1, j = 2, k = (short)(i + j);
但是請注意,在重載的情況下,變量的編譯時類型可以更改編譯器為調用選擇的方法。 如果類型具有不同的語義,這尤其重要,例如print(boolean)
或print(char)
。 盡管傳遞給方法的值在兩種情況下均為int
類型,但結果卻完全不同。
編譯器強制執行的差異的另一個示例是
{
int i = 1;
i++;
}
{
short s = 1;
s++;
}
被編譯為
0: iconst_1
1: istore_1
2: iinc 1, 1
5: iconst_1
6: istore_1
7: iload_1
8: iconst_1
9: iadd
10: i2s
11: istore_1
因此,由於計算總是以32位執行,因此編譯器會插入必要的代碼以將結果截斷為第二個增量的short
。 再次注意,沒有變量聲明,因此代碼與的編譯形式相同
int i = 1;
i++;
i = 1;
i = (short)(i+1);
值得一看的是Verification Type System ,因為驗證者將檢查從本地變量到本地變量的所有傳輸的有效性:
類型檢查器根據驗證類型的層次結構實施類型系統,如下所示。
Verification type hierarchy: top ____________/\\____________ / \\ / \\ oneWord twoWord / | \\ / \\ / | \\ / \\ int float reference long double / \\ / \\_____________ / \\ / \\ uninitialized +------------------+ / \\ | Java reference | / \\ | type hierarchy | uninitializedThis uninitialized(Offset) +------------------+ | | null
因此,與Java語言類型相比,類型系統得到了簡化,並且驗證程序不介意,例如,如果您將boolean
值傳遞給需要char
的方法,因為它們都是int
類型。
因為所有局部變量都至少占用一個32位插槽。 字節也一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.