35

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

4

2 回答 2

35

文件中的多字节数据以class大端方式存储。

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

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

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

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

如果一个操作数的大小超过一个字节,那么它首先以大端顺序-高位字节存储。例如,局部变量的无符号 16 位索引存储为两个无符号字节,byte1并且byte2,因此其值为(byte1 << 8) | byte2

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

于 2009-06-11T14:50:42.740 回答
21

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

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

于 2009-06-11T15:08:02.073 回答