Java的虚拟机的Endianness

时间:2009-06-11 14:47:57

标签: java virtual-machine endianness

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

2 个答案:

答案 0 :(得分:31)

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

来自The Java Virtual Machine Specification, Java SE 7 EditionChapter 4: The class File Format

  

一个类文件由一个流组成   8位字节。所有16位,32位和   64位数量由。构造   读两,四,八   分别为连续的8位字节。   始终存储多字节数据项   在大端的顺序,高的地方   字节排在第一位。

此外,字节码指令中的操作数如果跨越多个字节也是big-endian。

来自The Java Virtual Machine Specification, Java SE 7 EditionSection 2.11: Instruction Set Summary

  

如果操作数超过一个字节   大小,然后它存储在big-endian中   先订购高位字节。对于   例如,一个无符号的16位索引   局部变量存储为两个   无符号字节,byte1byte2等   它的值是(byte1 << 8) | byte2

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

答案 1 :(得分:18)

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

通常很难分辨机器在底下做什么,因为它被虚拟机抽象掉了。您无法在C和C ++中将short[]强制转换为byte[]java.nio.ByteOrder.nativeOrder()应该为您提供潜在的结束。使用非字节NIO缓冲区时,匹配的字节顺序非常有用。