Java的虚拟机的Endianness

Joe*_*ool 30 java virtual-machine endianness

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

coo*_*ird 31

class文件中的多字节数据存储为big-endian.

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

类文件由8位字节流组成.所有16位,32位和64位数量分别通过读取两个,四个和八个连续的8位字节构成.多字节数据项始终以big-endian顺序存储,其中高字节首先出现.

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

Java虚拟机规范,Java SE 7版,第2.11节:指令集汇总:

如果操作数的大小超过一个字节,则它首先以big-endian order-high-order字节存储.例如,局部变量的无符号16位索引存储为两个无符号字节,byte1并且byte2其值为(byte1 << 8) | byte2.

所以是的,我认为可以说Java虚拟机使用的是big-endian.

  • 这个答案极具误导性.所有参考文献都解释了多字节值如何存储在类文件中.而且类文件确实使用了大端.但是在运行时,我所知道的所有Java实现都以本机字节顺序存储变量和数据结构的数据.一旦将类文件加载到更好的可执行格式中,它很可能也适用于指令操作数.在i386这样的小端架构上,其他一切都会非常慢. (18认同)

Tom*_*ine 18

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

通常很难分辨机器在底下做什么,因为它被虚拟机抽象出来.你不能施放short[]byte[],你可以在C和C++.java.nio.ByteOrder.nativeOrder()应该为您提供底层的endianess.使用非字节NIO缓冲区时,匹配的字节顺序非常有用.