在Java语言规范中定义运行时Endianness的位置?

时间:2014-05-23 15:20:27

标签: java endianness bits jls

Java运行时似乎是Big Endian,但我找不到对此的引用,仅针对JVM的类文件规范。

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

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

而非lastByte == 160x10

或者它指定这是依赖于平台/ JVM的。

1 个答案:

答案 0 :(得分:4)

这不是语言的问题,而是虚拟机的问题 - 这就是它在Java虚拟机规范中定义的原因,而不是在Java语言规范中定义的原因。

实际上,这些按位计算的结果与字节序无关。假设Big-Endian:

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

或者Little-Endian:

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级别(如{{3}方法:

  

将int作为四个字节写入基础输出流,首先是高字节。


可以考虑使用字节序来影响语言语义的唯一部分是移位操作。但即使在那里,它主要是语言的解释的问题。 DataOutputStream::writeInt州:

  

n<< s是n个左移位位;这相当于(即使发生溢出)将2乘以幂s。

     

n的值>> s是带有符号扩展的右移位s位。结果值为[n / 2s]。对于n的非负值,这相当于将由整数除法运算符f计算的整数除法截断为幂2。

此处的规范指出现有的位是“左”移动的,同时,“左”是“更重要的位置”(但是,也可以说<<意味着“移位”对“在小端世界......”

相关问题