【问题标题】:Is java char big endian in JVM memory?JVM内存中的java char big endian吗?
【发布时间】: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


    【解决方案1】:

    类文件格式指定所有项目必须是大端。 http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html

    我还没有检查,但我怀疑 JNI 规范也谈到了字节序,我怀疑它是大字节序的。

    【讨论】:

    • 它已经有点旧了,但是为了防止每个人都在阅读这篇文章和 Joachim Sauer 的回答时感到困惑:这里给出的链接指定了(平台无关的).class 文件格式的字节序 - 而不是内存结构原始数据类型。我还没有阅读完整的规范,但我认为其他人是正确的并且没有指定,但任何/大多数 JVM 都会在内存中使用平台字节序。 NI 的 LabView 是我所见过的唯一一个会做一些疯狂的事情的东西,比如在小端系统上使用大端编码值。
    【解决方案2】:

    Java 是一种与字节顺序无关的语言。 (JVM 实现可能使用硬件字节序。)

    不过,将字符转换为字节序列的不同方式具有固定的字节序,例如DataOutputStream.

    【讨论】:

    • 谢谢 - 我们确定 JVM [至少常见的热点,如热点] 总是使用硬件字节序还是简单地使用 BE?
    • 为什么重要?从外面你看不出来。
    • 只是好奇,他们为什么做出这个决定[特别是如果是后者,总是 BE]?
    • 打印编译的程序集在我看来总是像使用硬件字节序一样。嗯。未指定,可能会在以后的版本中更改。
    • @Louis Wasserman - 你可能无法从外面看出,但我可以。
    【解决方案3】:

    VM 规范没有指定它,取决于 VM 如何处理它。

    而且由于没有直接的方法可以将 char 重新解释为两个 byte 值,您甚至看不到 Java 程序的决定结果(任何 Java 应用程序在符合标准的 VM 上都将完全一样,与 VM 的字节顺序无关)。

    【讨论】:

    • JNI 可以看到。 J 代表 Java IIRC。
    【解决方案4】:

    根据您的处理器硬件,单个 char 是 little-endian 还是 big-endian。大多数 Intel/AMD/ARM 处理器使用 little-endian,Sparc/Alpha 使用 big-endian。

    UTF-16 编码是 Java 在字符串中存储代码点(最多 0x1FFFF 的字符)的方式。 UTF-16LE 编码指的是如何将这样的字符串写入文件。

    【讨论】:

    • 字符不是处理器已知的概念。是 Java 对 2 个字节施加了一些“意义”。 UTF-16LE 意味着即使你只有 2 个字节。
    • A char 是一个无符号短整型,每个处理器都支持这种类型。将其视为两个字节将非常低效。
    • 但现在大多数处理器都是 64 位或 32 位的。所以即使是短的也和字节一样低效!
    • 我不是指地址部分。 64 位处理器将 64 位数据假定为“原子”单元。所以它是处理器最容易使用的单元。对于其他任何事情,它都必须在寄存器中进行位斩波。 en.wikipedia.org/wiki/64-bit "无需进一步限定,64 位计算机体系结构通常具有 64 位宽的整数和寻址寄存器,允许直接支持 64 位数据类型和地址。"
    • 我不想在 cmets 中进行太多讨论,但我同意,就比特而言,奔腾无处不在! ;-)
    猜你喜欢
    • 2019-03-13
    • 1970-01-01
    • 2020-12-01
    • 2015-10-15
    • 2018-05-15
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    相关资源
    最近更新 更多