【发布时间】:2010-11-02 03:58:28
【问题描述】:
Java 在其虚拟机中使用什么字节序?我记得在某处读到它取决于它运行的物理机器,然后在我读过的其他地方我相信它总是大端。哪个是正确的?
【问题讨论】:
标签: java virtual-machine endianness
Java 在其虚拟机中使用什么字节序?我记得在某处读到它取决于它运行的物理机器,然后在我读过的其他地方我相信它总是大端。哪个是正确的?
【问题讨论】:
标签: java virtual-machine endianness
class 文件中的多字节数据以大端方式存储。
来自The Java Virtual Machine Specification, Java SE 7 Edition,Chapter 4: The class File Format:
一个类文件由一个流组成 8 位字节。所有 16 位、32 位和 64 位量由以下方式构成 读二、四、八 连续的 8 位字节,分别。 始终存储多字节数据项 以大端顺序,其中高 字节在前。
此外,如果字节码指令中的操作数跨越多个字节,它也是大端的。
来自The Java Virtual Machine Specification, Java SE 7 Edition,Section 2.11: Instruction Set Summary:
如果一个操作数超过一个字节 大小,然后存储在大端 order-high-order 字节在前。为了 例如,一个无符号的 16 位索引 局部变量存储为两个 无符号字节,
byte1和byte2,例如 它的值是(byte1 << 8) | byte2。
所以是的,我认为可以说Java虚拟机使用大端。
【讨论】:
int 转换为 byte[],因此在 JVM 中运行的 Java 代码通常看不到这个细节,因此 JVM 很容易只使用原生 C int32_t。
存储在运行进程中的实际工作数据几乎肯定会匹配执行进程的字节序。通常文件格式(包括类文件)将按网络顺序(大端)。
通常很难判断机器在下面做什么,因为它被虚拟机抽象掉了。您不能像在 C 和 C++ 中那样将 short[] 转换为 byte[]。 java.nio.ByteOrder.nativeOrder() 应该给你潜在的字节序。使用非字节 NIO 缓冲区时,匹配字节序很有用。
【讨论】: