【问题标题】:Where runtime Endianness is defined in the Java Language Specification?Java 语言规范中在哪里定义了运行时字节序?
【发布时间】:2014-05-23 15:20:27
【问题描述】:

好像Java运行时是Big Endian,但是我找不到这个的参考,只针对JVM的类文件规范。

我正在 JLS 中寻找一个明确的位置(无论版本如何),它指定:

int value = 4096; // 0b0001 0000 0000 0000 = 0x10 00
                  //               \   /           |                             
int lastByte = value & 0xFF; //      |             |
assert lastByte == 0; // ---------------------------

而不是lastByte == 16 (0x10)

或者它指定这取决于平台/JVM。

【问题讨论】:

  • 是什么让您认为 Java 中定义了字节序?
  • 另外,你能用这些信息做什么? (我知道你很好奇。)
  • Java 语言不以任何方式指定或依赖字节序。并且在任何将字节序暴露给“外部世界”的官方接口中,数据的字节序都是明确指定的,并且通常是可指定的。并且做“bit twiddling”与字节序无关。
  • 您给出的示例绝不取决于字节序,因此您甚至无法检测字节序。

标签: java endianness bits jls


【解决方案1】:

这不是语言的问题,而是虚拟机的问题 - 这就是为什么它在 Java 虚拟机规范中定义,而不是在 Java 语言规范中。 p>

事实上,这些按位计算的结果与字节序无关。假设大端:

int value = 4111;                //   0x0000100F
int lastByte = value & 0xFF;     // & 0x000000FF
                                 // = 0x0000000F

或小端:

int value = 4111;                //   0xF0010000
int lastByte = value & 0xFF;     // & 0xFF000000
                                 // = 0xF0000000

在这两种情况下,结果是相同的(两种形式中的任何一种)。


现在人们可以争论0x0000000F 代表15,这意味着大字节序。这至少在词法结构的定义中隐含定义,在JLS Section 3.10.1, Integer Literals

最大的正十六进制、八进制和 int 类型的二进制字面量 - 每个都代表十进制值 2147483647 (2^31-1) - 分别是:

  • 0x7fff_ffff,
  • 0177_7777_7777,和
  • 0b0111_1111_1111_1111_1111_1111_1111_1111

除此之外,字节序主要与存储和通信有关,但这些不是语言方面的,并且可以通过 ByteOrder 类或 API 级别(如 DataOutputStream::writeInt 方法)来促进:

将一个 int 作为四个字节写入底层输出流,先是高字节。


字节顺序可以被认为影响语言语义的唯一部分是移位操作。但即便如此,这主要是语言的解释问题。 JLS Section 15.19 about Shift Operators 声明:

n

n >> s 的值是带符号扩展的 n 个右移 s 位位置。结果值为 [ n / 2s ]。对于 n 的非负值,这相当于将整数除法(由整数除法运算符 / 计算得出)除以 2 的 s 次幂。

这里的规范声明现有位被“左移”,同时,“左”是“更重要的位置”(但是,也可以说<< 表示“右移”在 Little-Endian 世界中......)

【讨论】:

  • 现在可以争论 0x0000000F 代表 15,这意味着大字节序。 那么 123.456f 在小字节序机器上如何解释呢??
  • @HotLicks 好吧,我只是想预测一下这个可能的论点,不管它无论如何只对十六进制文字有意义。 可以定义一种语言,其中 0xF0000000 表示 15,但在 Java 中不是这样......
  • @Marco13 这是我无法表达的怀疑之一,感谢您将其转化为文字!再澄清一点:如果您在不同的架构上将代码示例作为编译的 C++ 运行,是否会产生不同的结果?
  • @HotLicks f in 123.456f 是单精度浮点说明符,在 0x...FF 是十六进制数字。
  • @TWiStErRob 我很确定 HotLicks 知道 f 代表什么 ;-) 这可能只是针对这样一个事实,即词法结构并没有真正说明底层机器。关于 C++ 问题:我不完全确定您的意思,但您可能想看看 stackoverflow.com/questions/1041554 或类似问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多