大端序和小端序的差别

代码如下:

 

#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是大端序,这个本人验证过)

补充:
我们经常用移位操作,但从来没感受到大小端序对我们程序代码的影响,个人认为是操作系统或者编译器底层实现移位操作的时候屏蔽掉了这些细节,也就是说大端序和小端序平台的移位操作在实现上应该是不一样的,但给我们使用者的感受是一样的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值