大端模式、小端模式
阿新 • • 發佈:2019-01-28
舉一個例子,比如數字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++語言的情況。
本機測試如下: