當前的存儲器,多以byte為訪問的最小單元,當一個邏輯上的地址必須分割為物理上的若干單元時就存在了先放誰后放誰的問題,於是端(endian)的問題應運而生了,對於不同的存儲方法,就有大端(big-endian)和小端(little- endian)兩個描述。
字節排序按分為大端和小端,概念如下
大端(big endian):低地址存放高有效字節
小端(little endian):低字節存放地有效字節
現在主流的CPU,intel系列的是采用的little endian的格式存放數據,而motorola系列的CPU采用的是big endian,ARM則同時支持 big和little,網絡編程中,TCP/IP統一采用大端方式傳送數據,所以有時我們也會把大端方式稱之為網絡字節序。
特別需要注意的是,C/C++語言編寫的程序里數據存儲順序是跟編譯平台所在的CPU相關的,而 JAVA編寫的程序則唯一采用big endian方式來存儲數據。這里我就只討論C/C++語言的情況。
1.大端和小端的方式及判斷
舉個例子說明,我的機子是32位windows的系統,處理器是AMD的。對於一個int型數0x12345678,為方便說明,這里采用16進制表示。這個數在不同字節順序存儲的CPU中儲存順序如下:
0x12345678 16進制,兩個數就是一字節
高有效字節——>低有效字節: 12 34 56 78
低地址位 高低址位
大端: 12 34 56 78
小端: 78 56 34 12
#include<stdio.h> int main(void ){ unsigned int x =0x12345678; unsigned char *p = (unsigned char *)&x; printf("%0x %0x %0x %0x",p[0],p[1],p[2],p[3]); return 0; }
--------------鳴謝(NULL)作者,本篇文章只供自己學習,若原始作者能夠有建議,請郵件通知本人刪除!
