2009-06-11 52 views
28

Java在其虛擬機中使用什麼樣的字節順序?我記得在某個地方看到它取決於它運行的物理機器,然後我讀過其他地方,我相信它總是,我認爲是大端。哪個是對的?Java的虛擬機的字節碼

回答

30

class文件中的多字節數據存儲爲big-endian。

The Java Virtual Machine Specification, Java SE 7 EditionChapter 4: The class File Format

一類文件由 8位字節流的。所有16位,32位和 64位量分別由 構成,其分別在連續的8位字節中讀取2,4和8個 。 多字節數據項總是以big-endian順序存儲 ,其中高位爲 字節。

此外,如果跨越多個字節,字節碼指令中的操作數也是大端。

The Java Virtual Machine Specification, Java SE 7 EditionSection 2.11: Instruction Set Summary

如果操作數是 大小超過一個字節,則存儲在大端 訂單高位字節。對於 例如,一個無符號的16位索引 局部變量被存儲爲兩個 無符號字節,byte1byte2,例如 其值(byte1 << 8) | byte2

所以,我認爲可以說Java虛擬機使用big-endian。

+14

這個答案具有很高的誤導性。所有引用都解釋了多字節值如何存儲在類文件中。這個類文件的確使用了big endian。然而,在運行時,我知道所有的Java實現都以本地字節順序存儲變量和數據結構的數據。一旦類文件被加載到更好的可執行格式中,它很可能也適用於指令操作數。對於像i386這樣的小端架構,其他一切都會非常緩慢。 – Codo 2014-05-02 06:48:40

14

運行過程中存儲的實際工作數據幾乎肯定會與執行過程的字節匹配。通常文件格式(包括類文件)將按網絡順序(大端)排列。

通常很難說出機器在底下做什麼,因爲它被虛擬機抽象掉了。您不能像在C和C++中一樣使用short[]byte[]java.nio.ByteOrder.nativeOrder()應該給你潛在的恩惠。當使用非字節的NIO緩衝區時,匹配的字節順序非常有用。