Java语言规范中定义了运行时端性的地方?

Java语言规范中定义了运行时端性的地方?,java,endianness,bits,jls,Java,Endianness,Bits,Jls,Java运行时似乎是Big-Endian,但我找不到这方面的参考,只针对JVM的类文件规范 我正在JLS中寻找一个明确的位置(无论版本如何),其中规定: int value = 4096; // 0b0001 0000 0000 0000 = 0x10 00 // \ / | int lastByte = value & 0xFF; //

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语言规范中定义的原因

事实上,这些按位计算的结果与endianness无关。假设Big Endian:

int value = 4111;                //   0x0000100F
int lastByte = value & 0xFF;     // & 0x000000FF
                                 // = 0x0000000F
或者小恩迪安:

int value = 4111;                //   0xF0010000
int lastByte = value & 0xFF;     // & 0xFF000000
                                 // = 0xF0000000
在这两种情况下,结果是相同的(两种形式中的任何一种)


人们现在可以争论这样一个事实:
0x0000000F
代表
15
,这意味着大端性。这至少在词汇结构的定义中有隐含的定义,如:

int类型的最大正十六进制、八进制和二进制文本(每个文本代表十进制值2147483647(2^31-1))分别为:

  • 0x7fff_ffff
  • 0177_7777_7777,以及
  • 0b0111_1111_1111_1111_1111_1111_1111_1111

除此之外,endianness主要与存储和通信相关,但这些不是语言方面,并通过类或API级别(如方法)来实现:

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


endianness可以被认为影响语言语义的唯一部分是移位操作。但即便如此,这主要还是语言的解释问题。各国:

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


这里的规范说明现有位被“左”移位,同时,“左”是“更重要的位置”(然而,我们也可以说,
这不是语言的问题,而是虚拟机的问题——这就是为什么它在Java虚拟机规范中定义,而不是在Java语言规范中定义的原因

事实上,这些按位计算的结果与Endian无关。假设Big Endian:

int value = 4111;                //   0x0000100F
int lastByte = value & 0xFF;     // & 0x000000FF
                                 // = 0x0000000F
或者小恩迪安:

int value = 4111;                //   0xF0010000
int lastByte = value & 0xFF;     // & 0xFF000000
                                 // = 0xF0000000
在这两种情况下,结果是相同的(两种形式中的任何一种)


现在有人可能会争论这样一个事实,
0x0000000F
代表
15
,这意味着大端性。这至少在词汇结构的定义中有隐含的定义,在:

int类型的最大正十六进制、八进制和二进制文本(每个文本代表十进制值2147483647(2^31-1))分别为:

  • 0x7fff_ffff
  • 0177_7777_7777,以及
  • 0b0111_1111_1111_1111_1111_1111_1111_1111

除此之外,endianness主要与存储和通信相关,但这些不是语言方面,并通过类或API级别(如方法)来实现:

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


endianness可以被认为影响语言语义的唯一部分是移位操作。但即便如此,它主要还是语言的解释问题。状态:

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


这里的规范指出,现有的位被“左”移,同时,“左”是“更重要的位置”(然而,人们也可以说,
可能的重复:是什么让你认为endianness是在Java中定义的?还有,你能对这些信息做些什么?(我知道你很好奇。)Java语言不以任何方式指定或依赖于endianness。在任何向“外部世界”公开endianness的官方接口中,数据的endianness都被很好地指定,并且通常是可指定的。并且进行“位旋转”与endianness无关。您给出的示例完全不依赖endianness,因此您甚至无法检测endianness。可能的重复:是什么让您认为endianness是在Java中定义的?另外,您可以对这些信息做些什么?(我知道您很好奇。)Java语言不以任何方式指定或依赖于endianness。在任何向“外部世界”公开endianness的官方接口中,数据的endianness都被很好地指定,并且通常是可指定的。并且进行“位旋转”与endianness无关。您给出的示例完全不依赖endianness,因此您甚至无法检测endianness。现在有人可能会争论0x0000000F代表15,这意味着大endianness。那么123.456f在小型endianness机器上如何解释???@HotLicks好吧,我只是想预测这可能的argument,不管它是否只对十六进制文字有意义。可以定义一种语言,其中0xF0000000表示15,但在Java中不是这样的…@Marco13这是我的一个怀疑,我无法表达,谢谢你把它用文字表达出来!再一次澄清:如果你运行你的cod,这不是真的吗例如,C++在不同架构上的例子会产生不同的结果吗?@代码中的HythLixsCuff>代码>