2009-06-11 42 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缓冲区时,匹配的字节顺序非常有用。