Java语言规范中定义了运行时端性的地方?
Java运行时似乎是Big-Endian,但我找不到这方面的参考,只针对JVM的类文件规范 我正在JLS中寻找一个明确的位置(无论版本如何),其中规定: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; //
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>代码>