[整理] 大端與小端存儲模式詳解

在內存管理中,對於堆來說,生長方向是向上的,也就是向着內存地址增長的方向;對於棧來說,它的生長方式是向下的,是向着內存地址減少的方向增加。html

按照存儲地址的高低,低地址在前,高地址在後,若是最低有效字節在最高有效字節的前面(地址上是小於的關係),則稱小端序;反之則稱大端序。在網絡應用中,字節序是一個必須被考慮的因素,由於不一樣機器類型可能採用不一樣標準的字節序,因此均按照網絡標準轉化。網絡

例如假設上述變量x類型爲int,位於地址0x100處,它的十六進制爲0x01234567,地址範圍爲0x100~0x103字節,其內部排列順序依賴於機器的類型。大端法從首位開始將是:0x100: 01, 0x101: 23,..。而小端法將是:0x100: 67, 0x101: 45,..。函數

x86,MOS Technology 6502,Z80,VAX,PDP-11等處理器爲Little endian。.net

Motorola 6800,Motorola 68000,PowerPC 970,System/370,SPARC(除V9外)等處理器爲Big endian。code

ARM, PowerPC (除PowerPC 970外), DEC Alpha, SPARC V9, MIPS, PA-RISC and IA64的字節序是可配置的。htm

判斷大小端(C語言):blog

union
    {
        char str;
        int data;
    };
    data=0x01020304;
    if(str==0x01)
    {
        cout<< "此機器是大端!"<<endl;
    }
    else if(str==0x04){
        cout<<"此機器是小端!"<<endl;
    }
    else{
        cout <<" 暫沒法判斷此機器類型!"<<endl;
    }

注意,高位字節不必定放在高地址上,字符串「abc」中a也是高位字節。ip

網絡字節序

網絡傳輸通常採用大端序,也被稱之爲網絡字節序,或網絡序。IP協議中定義大端序爲網絡字節序。內存

網絡上傳輸的數據都是字節流,對於一個多字節數值,在進行網絡傳輸的時候,先傳遞哪一個字節?也就是說,當接收端收到第一個字節的時候,它將這個字節做爲高位字節仍是低位字節處理,是一個比較有意義的問題; UDP/TCP/IP協議規定:把接收到的第一個字節看成高位字節看待,這就要求發送端發送的第一個字節是高位字節;而在發送端發送數據時,發送的第一個字節是該數值在內存中的起始地址處對應的那個字節,也就是說,該數值在內存中的起始地址處對應的那個字節就是要發送的第一個高位字節(即:高位字節存放在低地址處);因而可知,多字節數值在發送以前,在內存中因該是以大端法存放的; 因此說,網絡字節序是大端字節序; 好比,咱們通過網絡發送整型數值0x12345678時,在80X86平臺中,它是以小端發存放的,在發送以前須要使用系統提供的字節序轉換函數htonl()將其轉換成大端法存放的數值。字符串

具體見http://bdxnote.blog.163.com/blog/static/8444235201091054458112/

##資料

如何判斷一個機器是大端仍是小端
大端模式與小端模式、網絡字節順序與主機字節順序 (經典)
字節序--維基百科
棧增加方向與大端/小端問題
大端、小端、網絡字節序
大端與小端存儲模式詳解

相關文章
相關標籤/搜索