大小端模式
什麼是大小端模式
1)大端模式,小端模式
2)通信協議中,發送方和接收方必須按同樣的字節順序來通信,否則會出錯。
常見的,在socket通信中,常用到的函數:hton(),定義端口號或者ip地址時,需要考慮字節序。
3)除了通信協議,在計算機存儲系統中也有大小端
一個32位的2進制在內存中存儲時有兩種發佈方式:
圖示如下:高字節 對應 高地址 --------------> 小端模式
高字節 對應 低地址 --------------> 大端模式
大小端存在的意義
1)在通信協議中,大小端模式是非常重要的。
2)在實際中,有些CPU用的是大端,有些則是小端,如不加以區別的話,可能會出現讀取時和儲存時字節順序不一致的情況,從而造成數據的錯誤。
3)網絡通信中一般爲大端模式,常用計算機CPU爲小端模式。
如何判斷
用共用體union或指針可以測試出
共用體union測試
union myunion { int a; char b; }; // int is_little(void) { union myunion u1; u1.a = 1; return u1.b; } int main(int argc, const char * argv[]) { // insert code here... int i = is_little(); if (i == 1) { printf("little\n"); }else{ printf("big\n"); } return 0; }
圖示如下:
共用體union與結構體struct
1)在定義和用法上很相似:
struct mystruct { int a; char b; }; union myunion { int a; char b; long c; int d[10]; };
int main(int argc, const char * argv[]) { // insert code here... struct mystruct s1; s1.a = 23; printf("s1.b = %d\n", s1.b); // s1.b = 0 union myunion u1; u1.a = 23; printf("u1.b = %d\n", u1.b); // u1.b = 23 printf("u1.a地址 = %p\n", &u1.a); // u1.a地址 = 0x7fff5fbff7b0 printf("u1.b地址 = %p\n", &u1.b); // u1.b地址 = 0x7fff5fbff7b0 // 說明u1.a和u1.b是共用的 return 0; }
2)不同之處:
① 結構體中的成員是相互獨立的
② 共用體中的成員是一體的,彼此是不獨立的,共使用同一個內存單元。
共用體因爲只有一個共用的空間,所以不存在內存對齊的問題
union的大小爲成員中最大的那個的大小
指針方式測試
int is_little(void) { int a = 1; char b = *((char *)(&a)); return b; } int main(int argc, const char * argv[]) { // insert code here... int i = is_little(); if (i == 1) { printf("little\n"); }else{ printf("big\n"); } return 0; }