Java非字節類型的基本類型,除了布爾型都是由組合在一起的幾個字節組成的。這些數據類 型及其大小總結在表 2-1 中。
|
表:基本數據類型及其大小 |
|
|
數據類型 |
大小(以字節表示) |
|
Byte |
1 |
|
Char |
2 |
|
Short |
2 |
|
Int |
4 |
|
Long |
8 |
|
Float |
4 |
|
Double |
8 |
每個基本數據類型都是以連續字節序列的形式存儲在內存中。例如,32 位的 int 值 0x037fb4c7(十進制的 58,700,999),如果是大端字節順序則如左圖所顯示的那樣被塞入內存字節中 (內存地址從左往右增加)。如果是小端字節順序,則低位(例如03)放在字節的小端,如下面的兩個圖。
多字節數值被存儲在內存中的方式一般被稱為 endian-ness(字節順序)。如果數字數 值的最高字節——big end(大端),位於低位地址,那么系統就是大端字節順序(如左圖所示)。如果最低字節最先保存在內存中,那么就是小端字節順序(如右圖所示)。記憶方法就是看誰先放於低位地址,如果是高位字節就是大端;如果是 低位字節就是小端。
字節順序很少由軟件設計者決定;它通常取決於硬件設計。字節順序的兩種類型有時被稱 為字節性別,在當今被廣泛使用。兩種方式都具有自身的優勢。Intel 處理器使用小端字節 順序涉及。摩托羅拉的 CPU 系列、SUN 的 Sparc 工作站,以及 PowerPC 的 CPU 架構都采用 大端字節順序。
那么Java中如何確定一個當前環境所用的CPU是何種類型的字節順序呢。我在java.nio.Bits中看見一段代碼是這樣實現的,很有意思。
static { long a = unsafe.allocateMemory(8); try { unsafe.putLong(a, 0x0102030405060708L); byte b = unsafe.getByte(a); switch (b) { case 0x01: byteOrder = ByteOrder.BIG_ENDIAN; break; case 0x08: byteOrder = ByteOrder.LITTLE_ENDIAN; break; default: assert false; byteOrder = null; } } finally { unsafe.freeMemory(a); } }
原理很簡單,就是先分配8個字節Long類型的內存,然后放內存中放入16進制0x0102030405060708L的數據,判斷第一個字節是0x01還是0x08,如果是0x01,則說明大端字節順序,如果是最大的0x08,則是小端字節順序。
