一、定義
大端模式:
大端模式就是指把數據的高字節保存在內存的低地址中,數據的低字節保存在內存的高地址中,這和我們一般的閱讀順序是一致的。
小端模式:
小端模式與大端模式相反,數據的高字節位置保存在內存的高地址處,數據的低字節保存在內存的低地址處。這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低。
圖解
畫張圖簡單解釋下大小端的區別,比如我們要存取一個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 )