Java 在其虚拟机中使用什么字节序?我记得在某处读到它取决于它运行的物理机器,然后我在其他地方读到它总是,我相信,大端。哪个是正确的?
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虚拟机使用big-endian。
运行进程中存储的实际工作数据几乎肯定会与执行进程的字节顺序相匹配。一般来说,文件格式(包括类文件)将采用网络顺序(大端)。
通常很难判断机器在底层做什么,因为它被虚拟机抽象掉了。您无法像在 C 和 C++ 中那样将
short[]
转换为 byte[]
。 java.nio.ByteOrder.nativeOrder() 应该为您提供底层的字节顺序。使用非字节 NIO 缓冲区时,匹配字节序非常有用。
如前所述,你不能搞乱 Short[] 和 byte[]。
在某些情况下,JVM 代码可以允许混合 双倍或长的两半。你不应该 不过,要这样做。
类验证器将检测,例如,推送 long 入栈,并弹出两个 int。
它可能会也可能不会在运行时被检测到。