1. 程式人生 > >大端模式、小端模式

大端模式、小端模式


舉一個例子,比如數字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++語言的情況。
本機測試如下: