Java中的char类型在JVM内存中是大端序的吗?

3

Java中的char在JVM内存[堆/栈]中是大端还是小端?也就是说,它是UTF-16 LE还是UTF-16 BE?

我认为这并不重要,取决于JVM的实现,并保持本机芯片顺序以提高性能。例如,对于英特尔处理器来说,是LE。这正确吗?

还是它在Java规范中有明确规定?

4个回答

7

这已经有点过时了,但是为了防止所有人在阅读这个和Joachim Sauer的答案时感到困惑:此处给出的链接指定了(与平台无关的).class文件格式中的字节顺序——而不是基本数据类型的内存结构。我没有完整地阅读规范,但我认为其他人是正确的,它没有被指定,但任何/大多数JVM都会在内存中使用平台字节顺序。NI的LabView是我目前看到的唯一使用大端编码值在小端系统上的疯狂行为。 - Beppo

2

Java语言本身与大小端无关。(虚拟机实现可能使用硬件端口。)

不同的字符转换成字节序列的方式有固定的大小端,例如DataOutputStream


1
谢谢 - 我们确定JVM(至少像热点这样的常见JVM)总是使用硬件字节序,还是仅使用BE? - Fakrudeen
为什么这很重要?从外部看不出来。 - Louis Wasserman
1
只是好奇,为什么他们做出了那个决定[特别是如果它是后者,总是BE]? - Fakrudeen
1
打印已编译的汇编代码总是让我觉得它使用了硬件字节序。嗯,这并没有被明确指定,可能会在未来的版本中更改。 - Louis Wasserman
@Louis Wasserman - 你可能从外表上看不出来,但我可以。 - hoodaticus

0

虚拟机规范并没有明确指定这个问题,而是由虚拟机自己决定如何处理。

而且由于没有直接的方法将 char 解释为两个 byte 值,因此你甚至无法从Java程序中看到这个决策的结果(任何一个符合规范的虚拟机上的Java应用程序都会表现完全相同,与虚拟机的字节序无关)。


JNI 可以看到它。J 代表 Java,如果我没记错的话。 - hoodaticus

0
一个单个字符的字节序(little-endian或big-endian)取决于你的处理器硬件。大多数Intel/AMD/ARM处理器使用little-endian,而Sparc/Alpha使用big-endian。
UTF-16编码是Java用来存储代码点(最高可达0x1FFFF的字符)在字符串中的方式。UTF-16LE编码指的是这样一个字符串如何写入文件。

1
字符并不是处理器所知道的概念。它是Java对2个字节施加了一些“含义”。即使只有2个字节,UTF-16LE也具有某种意义。 - Fakrudeen
1
但是现在大多数处理器都是64位或32位的。因此,即使是short类型也和byte一样低效! - Fakrudeen
2
我并不是指地址部分。64位处理器假定64位数据为“原子”单位。因此,这是处理器最容易处理的单位。对于其他任何东西,它都必须在寄存器中进行位切割。http://en.wikipedia.org/wiki/64-bit “没有进一步的限定,64位计算机体系结构通常具有整数和寻址寄存器,其宽度为64位,允许直接支持64位数据类型和地址。” - Fakrudeen
维基百科的引用在我看来有点误导人。CPU的位数完全由指针的大小决定。如果CPU可以直接处理的数据大小决定了位数,那么第一款奔腾处理器就可以称为80位处理器,因为它具有80位FPU寄存器。但实际上不是这样的,它是32位的,因为Pentium中指针的范围是32位。 - doug65536
1
我不想在评论区引发太多讨论,但同意,就位数而言,奔腾处理器确实无处不在!;-) - doug65536
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接