Java在其虚拟机中使用哪种字节序?我记得曾经在某个地方读到过这取决于它运行的物理机器,而在其他地方,我读到它总是使用大端字节序。哪一个是正确的呢?
Java在其虚拟机中使用哪种字节序?我记得曾经在某个地方读到过这取决于它运行的物理机器,而在其他地方,我读到它总是使用大端字节序。哪一个是正确的呢?
在class
文件中,多字节数据是以大端方式存储的。
引自Java虚拟机规范,Java SE 7版,第4章:class文件格式:
类文件由一系列8位字节流组成。所有16位、32位和64位的数据都是通过读取连续的2个、4个或8个8位字节来构造的。多字节数据始终以大端序存储,其中高字节先出现。
此外,如果操作数跨越多个字节,则字节码指令中的操作数也是大端字节序。
引自Java虚拟机规范,Java SE 7版,第2.11节:指令集概述:
如果操作数的大小超过一个字节,则按照大端序存储,即高阶字节先出现。例如,局部变量中的无符号16位索引被存储为两个无符号字节
byte1
和byte2
,其值为(byte1 << 8) | byte2
。
因此,可以说Java虚拟机使用大端序。
实际工作数据存储在运行进程中,几乎肯定与执行进程的字节序相匹配。通常文件格式(包括类文件)将采用网络顺序(大端序)。
通常很难知道机器在底层做什么,因为它被虚拟机抽象掉了。你不能像在C和C++中那样将short[]
强制转换为byte[]
。使用java.nio.ByteOrder.nativeOrder()可以获得底层字节序。当使用非字节NIO缓冲区时,匹配字节序非常有用。
int
强制转换为byte[]
,因此这个细节通常对在 JVM 中运行的 Java 代码不可见,因此 JVM 可以轻松地使用本地 C 的int32_t
。 - Peter Cordes