[英]Where runtime Endianness is defined in the Java Language Specification?
看来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语言规范中定义它。
实际上,这些按位计算的结果与字节序无关。 假设大端:
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第3.10.1节“整数文字 ”的词法结构的定义中隐式定义的:
int类型的最大正十六进制,八进制和二进制文字(分别代表十进制值2147483647(2 ^ 31-1))分别为:
- 0x7fff_ffff,
- 0177_7777_7777和
- 0b0111_1111_1111_1111_1111_1111_1111_1111
除此之外,字节序主要与存储和通信有关,但是这些不是语言方面,可以通过诸如ByteOrder类或在API级别上(例如在DataOutputStream :: writeInt方法中)来实现:
将int以四个字节的形式写入基础输出流,高字节在前。
可以认为字节序会影响语言语义的唯一部分是移位操作。 但是即使在那儿,也主要是语言的解释问题。 关于移位运算符的JLS第15.19节指出:
n << s的值是n个左移的s位位置; 这等效于(即使发生溢出)乘以2的幂s。
n >> s的值是带有符号扩展名的n个右移s位位置。 结果值为[n / 2s]。 对于n的非负值,这等效于将整数除法运算符/计算出的整数除法以2乘以幂s。
这里的规范规定,在现有个位移“左”,并在同一时间,即“左”是“越显著位置”(然而,人们也可以说, <<
手段在Little-“右移” Endian世界...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.