簡體   English   中英

Java語言規范在哪里定義了運行時字節序?

[英]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 == 160x10

或在其中指定依賴於平台/ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM