【发布时间】:2012-07-26 09:26:10
【问题描述】:
JVM 内存 [stack/heap] 中的 java char 是 big endian 吗?那是 UTF-16 LE 还是 UTF-16 BE?
我认为这真的不应该那么重要,这取决于 JVM 实现并保持本机芯片顺序以获得性能。原因。那是英特尔等的LE。对吗?
或者它是在 Java 规范中指定的。自己?
【问题讨论】:
标签: java jvm endianness
JVM 内存 [stack/heap] 中的 java char 是 big endian 吗?那是 UTF-16 LE 还是 UTF-16 BE?
我认为这真的不应该那么重要,这取决于 JVM 实现并保持本机芯片顺序以获得性能。原因。那是英特尔等的LE。对吗?
或者它是在 Java 规范中指定的。自己?
【问题讨论】:
标签: java jvm endianness
类文件格式指定所有项目必须是大端。 http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html
我还没有检查,但我怀疑 JNI 规范也谈到了字节序,我怀疑它是大字节序的。
【讨论】:
Java 是一种与字节顺序无关的语言。 (JVM 实现可能使用硬件字节序。)
不过,将字符转换为字节序列的不同方式具有固定的字节序,例如DataOutputStream.
【讨论】:
VM 规范没有指定它,取决于 VM 如何处理它。
而且由于没有直接的方法可以将 char 重新解释为两个 byte 值,您甚至看不到 Java 程序的决定结果(任何 Java 应用程序在符合标准的 VM 上都将完全一样,与 VM 的字节顺序无关)。
【讨论】:
根据您的处理器硬件,单个 char 是 little-endian 还是 big-endian。大多数 Intel/AMD/ARM 处理器使用 little-endian,Sparc/Alpha 使用 big-endian。
UTF-16 编码是 Java 在字符串中存储代码点(最多 0x1FFFF 的字符)的方式。 UTF-16LE 编码指的是如何将这样的字符串写入文件。
【讨论】:
char 是一个无符号短整型,每个处理器都支持这种类型。将其视为两个字节将非常低效。