判斷大端小端


大端模式(big endian)和小端模式(little endian)。


在我們發送數據的時候,我們首先要確定是大端還是小端模式來進行的,在接收方接收的數據必須知道數據是大端還是小端模式,才能正確地讀取和存儲數據起來,否則就會出錯。

一個32位的二進制在內存中的存儲時有2中分布方式:高字節對應高字節(大端模式)、高字節對應低地址(小端模式)。

有些時候CPU公司用大端(C51單片機);有些CPU用小端(ARM)。我們寫代碼的時候需要通過寫代碼來測試當前系統是打斷還是小端模式

兩種方法:

1.利用地址強制類型轉換

void funtest1()
{
    int i = 1;
    char* j = (char*)&i;
    if (*j == 1)
    {
        printf("小端存儲\n");
    }
    else
        printf("大端存儲\n");
}

2.利用聯合體性質:不同類型變量共享同一塊內存

 

void funtest2()
{
    union UN
    {
        int i;
        char c;
    }u;
    u.i = 1;
    
    if (u.c == 1)
    {
        printf("小端存儲\n");
    }
    else
        printf("大端存儲\n");
}

 

注:

1)聯合體的概念和特征:union維護足夠的空間來存放多個數據成員中的“一種”,而不為每一個數據成員都配置空間,在union中所有的成員共用同一個空間,同一時間只存儲一個數據成員,最大的特征就是所有的數據成員具有相同的起始地址即聯合體的基地址。

2)計算機中字節存儲主要有兩種:大端模式(Big_endian)和小端模式(Little_endian),從英文名字上可以明白,大端模式是從低地址開始,高位結束;小端模式是從高地址開始,低地址結束。

3)利用union中所有數據成員具有同樣的起始地址的特點,通過一個int成員存儲1,然后通過char成員來讀取,即可巧妙地得出數據存放的方式,若通過char成員(即讀取起始位置上的第一個字節)讀取,若得出值為1,則說明是小端模式。

 

參考:

https://www.cnblogs.com/linux-sir/archive/2012/07/10/2585537.html

https://blog.csdn.net/qq_35409955/article/details/73557444

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM