大小端模式

大小端模式


什麼是大小端模式


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;
}









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