大端序和小端序的差別

代碼如下:

 

#include <iostream>
using namespace std;

typedef struct
{
    unsigned char a1: 1;
    unsigned char a2: 1;
    unsigned char a3: 1;
    unsigned char a4: 1;
    unsigned char a5: 1;
    unsigned char a6: 1;
    unsigned char a7: 1;
    unsigned char a8: 1;
}Data;

int main(int argc, char** argv)
{
    unsigned char a = 0xab;//10101011
    Data *test = (Data*)&a;
    cout<<(unsigned int)test->a1<<(unsigned int)test->a2;
    cout<<(unsigned int)test->a3<<(unsigned int)test->a4;
    cout<<(unsigned int)test->a5<<(unsigned int)test->a6;
    cout<<(unsigned int)test->a7<<(unsigned int)test->a8<<endl;

    unsigned short data=0X8284;
    unsigned char *p = (unsigned char*)&data;

    if(*p == 0X82)
    {
        cout<<"big endian order"<<endl;
    }
    else if(*p == 0x84)
    {
        cout<<"little endian order"<<endl;
    }
    return 0;
}

 
環境:
bash-2.05$ uname -a
SunOS test 5.9 Generic_112233-12 sun4u sparc SUNW,Ultra-80
輸出結果:
10101011
big endian order

環境:
test@develop:~$ uname -a
Linux develop 2.6.35-24-generic #42-Ubuntu SMP Thu Dec 2 02:41:37 UTC 2010 x86_64 GNU/Linux
輸出結果:
11010101
little endian orde

結論:
大端序:低地址存放高位,不管是在字節之間還是字節內部,內存中存放數據的位置跟我們頭腦中以及教科書上的順序是一致的,比如數字0X1234,在內存中存放的序列是:0001 0010 0011 0100
小端序:地地址存放低位,順序剛好跟大端序相反,比如數字0X1234,在內存中存放的序列是:0010 1100 0100 1000

大小端序跟硬件的體系結構有關,所有x86系列的pc機都是小端序,跟操作系統無關(網上都這麼說,可是無法驗證,但在x86系列的pc上的solaris系統是小端序,sun sparc平臺的solaris是大端序,這個本人驗證過)

補充:
我們經常用移位操作,但從來沒感受到大小端序對我們程序代碼的影響,個人認爲是操作系統或者編譯器底層實現移位操作的時候屏蔽掉了這些細節,也就是說大端序和小端序平臺的移位操作在實現上應該是不一樣的,但給我們使用者的感受是一樣的

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