大端模式、小端模式


舉一個例子,比如數字0x12 34 56 78在內存中的表示形式爲:

1)大端模式:

低地址 -----------------> 高地址
0x12  |  0x34  |  0x56  |  0x78

2)小端模式:

低地址 ------------------> 高地址
0x78  |  0x56  |  0x34  |  0x12

32bit寬的數0x12345678在Little-endian模式以及Big-endian模式)CPU內存中的存放方式(假設從地址0x4000開始存放)爲:

內存地址 小端模式存放內容 大端模式存放內容
0x4000 0x78 0x12
0x4001 0x56 0x34
0x4002 0x34 0x56
0x4003 0x12 0x78




        現在主流的CPU,intel系列的是採用的little endian的格式存放數據,而motorola系列的CPU採用的是big endian,ARM則同時支持 big和little。

        網絡編程中,TCP/IP統一採用大端方式傳送數據,所以有時我們也會把大端方式稱之爲網絡字節序。
        在java網絡開發中通常涉及到字節序的數據類型是多字節數據類型:int,short,long型等,單字節數據byte沒有影響。
        由於java採用的字節序同網絡協議採用的字節序是一樣的,它們都是選擇的人們通常更容易理解的大端模式(big endian),所以java在接收網絡數據是不需要像C/C++那樣先調用ntohl和ntohs實現網絡字節序與主機字節序的轉換,java程序可以直接接收網絡數據來進行處理。
        然而在與採用不同字節序的語言所編寫的程序進行通信時,java程序中通常要進行數據類型的轉換和解析


特別需要注意的是,C/C++語言編寫的程序裏數據存儲順序是跟編譯平臺所在的CPU相關的,而 JAVA編寫的程序則唯一採用big endian方式來存儲數據。這裏我就只討論C/C++語言的情況。
本機測試如下:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章