大小端問題

一、定義

大端模式:
大端模式就是指把數據的高字節保存在內存的低地址中,數據的低字節保存在內存的高地址中,這和我們一般的閱讀順序是一致的。

小端模式:
小端模式與大端模式相反,數據的高字節位置保存在內存的高地址處,數據的低字節保存在內存的低地址處。這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低。

圖解
畫張圖簡單解釋下大小端的區別,比如我們要存取一個0x12345678的數據,在大小端機器的存取方式分別是:

二、判斷機器大小端方式

字符指針判斷
在32位平臺下,int佔4個字節,而char類型的指針是佔一個字節的,如果我們把int強傳爲char類型的指針,只會保存第一個字節的數據,那麼我們只需要判斷char裏面的第字節和int裏面的第一個字節是否是一致即可判斷。
如果一致則爲小端模式,反之爲大端模式。


#include <iostream>
using namespace std;
int main()
{
    int a = 1;
    //0x00 00 00 01    大端存儲方式
    //0x01 00 00 00    小端存儲方式
    //char 只存一個字節
    //大端 0x00      == 0
    //小端 0x01      == 1  
    if (*(char*)&a == 1)    
        cout << "小端模式" << endl;
    else
        cout << "大端模式" << endl;
    return 0;
}

大端轉換成小端模式:

32位:

#define swap32Big2Little(x)    (   ( (x)&(0x0000ffff) ) << 32 | ( (x)&(0xffff0000) >> 32   )

64位:

#define swap64Big2Little(x)    (   ( (x)&(0x00000000ffffffff) ) >> 64 |  ( (x)&(0xffffffff00000000) >>64  )
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章