大端和小端

內存地址是連續有序的。計算機存儲數據與內存尋址是以字節爲單位的。java

當存儲byte類型時,須要一個字節的內存,存儲與讀取無異議。編碼

但當存儲char(java 使用uniconde編碼,1個字符佔兩個字節)、short,int等類型,須要多個字節內存空間,怎麼存儲呢?低位置的第一個字節,是存儲數據的低位(小端模式),仍是存儲數據的高位(大端模式)呢。spa

例如一個16bit的short型,值爲0x1122那麼0x11爲數據的高位,0x22爲數據的低位。其在內存中的地址爲0x0010(即佔用0x0010,0x0011兩個字節),對於大端模式,就將0x11(數據高位)放在低地址中,即0x0010中,0x22(數據低位)放在高地址中,即0x0011中。小端模式,恰好相反。code

若是把內存看做是從右向左的,地址依次增大;數據左邊爲高位,右邊爲低位,也是從右向左依次增大,若是存儲順序一致,則是小端;相反,則是大端。內存

public class _01_判斷大端小端 {
    public static void main(String[] args) {

        if (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN) {
            System.out.println("BIG_ENDIAN");
        } else {
            System.out.println("LITTLE_ENDIAN");
        }

        //誤解:
        int i = 1;
        byte b = (byte)i;// 並不能判斷大小端,由於向下的類型轉換時,保留的是a值的低字節部分,而不是內存中數據的低地址字節部分
        System.out.println(b);
        if(b == 1)
            System.out.println("LITTLE_ENDIAN");
        else
            System.out.println("BIG_ENDIAN");

        System.out.println(i&0xff);
    }
}
相關文章
相關標籤/搜索