Java的虚拟机的字节顺序
Java在其虚拟机中使用的是什么endianness? 我记得在某个地方看到它取决于它正在运行的物理机器,然后我读到的其他地方,我总是相信,它是大端。 哪个是对的?
class
文件中的多字节数据存储为big-endian。
从Java虚拟机规范,Java SE 7版 , 第4章: class
文件格式 :
一个类文件由一个8位字节的stream组成。 所有的16位,32位和64位量分别通过读取2,4,8个连续的8位字节来构造。 多字节数据项总是以big-endian顺序存储,其中高字节排在第一位。
此外,字节码指令中的操作数如果跨越多个字节也是大端的。
从Java虚拟机规范,Java SE 7 Edition , 第2.11节:指令集摘要 :
如果一个操作数的大小超过一个字节,那么它首先被存储在big-endian order-high-order byte中。 例如,一个无符号的16位索引存入本地variables中,作为两个无符号字节
byte1
和byte2
,其值为(byte1 << 8) | byte2
(byte1 << 8) | byte2
。
所以是的,我认为可以说Java虚拟机使用的是big-endian。
存储在运行过程中的实际工作数据几乎肯定会与执行过程的永久性匹配。 通常文件格式(包括类文件)将按networking顺序(大端)排列。
通常很难分辨出机器在底下做什么,因为它被虚拟机抽象掉了。 您不能像在C和C ++中一样short[]
为byte[]
。 java.nio.ByteOrder.nativeOrder()应该给你的底层endianess。 当使用非字节的NIO缓冲区时,匹配的字节顺序非常有用。