Java的虚拟机字节序

2022-09-01 06:01:54

Java 在其虚拟机中使用了什么字节序?我记得在某个地方读到过,它取决于它正在运行的物理机器,然后在其他地方我读到过,我相信它总是大端序。哪个是正确的?


答案 1

文件中的多字节数据存储为大端。class

摘自 Java 虚拟机规范,Java SE 7 版第 4 章:文件格式

类文件由 8 位字节流组成。所有 16 位、32 位和 64 位数量都是通过分别读取 2 个、4 个和 8 个连续的 8 位字节来构造的。多字节数据项始终按大端顺序存储,其中高字节排在第一位。

此外,如果字节码指令跨越多个字节,则它也是大端数。

摘自 Java 虚拟机规范,Java SE 7 版第 2.11 节:指令集摘要

如果操作数的大小超过一个字节,则它首先存储在大端顺序高阶字节中。例如,局部变量中的无符号 16 位索引存储为两个无符号字节和 ,使得其值为 。byte1byte2(byte1 << 8) | byte2

所以,是的,我认为可以说Java虚拟机使用大端。


答案 2

存储在正在运行的进程中的实际工作数据几乎肯定会与执行进程的持久性相匹配。通常文件格式(包括类文件)将按网络顺序排列(大端序)。

通常很难判断机器在下面做什么,因为它被虚拟机抽象出来了。你不能像在C和C++中那样将a强制到。java.nio.ByteOrder.nativeOrder() 应该给你底层的 endianess。使用非字节 NIO 缓冲区时,匹配字节序非常有用。short[]byte[]


推荐