:大端和小端

大端和小端

    嵌入式开发者应该对大端和小端很熟悉。在内存单元中数据是以字节为存储单位的,对于多字节数据,在小端模式中,低字节数据存放在低地址单元,而在大端模式 中,低字节数据存放在高地址单元。比如一个定义一个short型的变量a,赋值为1,由于short型数据占2字节。

在小端模式中,其存放方式为

0X4000  00000001

0X4001  00000000

而在大端模式中,其存放方式为

0X4000  00000000

0X4001  00000001

若需用程序验证系统是大端模式还是小端模式(一般我们用的x86结构的都是小端模式),有两种方法

1.利用联合体的性质

    因为联合体中的成员是共享内存的,并且数据是从低地址存放的,可以利用这一性质判断。

复制代码
typedef union 

{

    char a;

    short c;

}U;



int checkCPU1()  //若是小端则返回1,否则返回0 

{

    U u;

    u.c=1;

    //printf("%d\n",u.a);

    return u.a==1;

}
复制代码

由于short占2字节,而char占1字节,当对c赋值为1时,若系统为小端模式,则在系统中存放方式为:

000000001

000000000

那么当取a的值时,a的整型值必定为1;否则为0.

2.强制取低地址单元的数据

复制代码
int checkCPU2()

{

    short a=0x1234;

    char *p=(char *)&a;

    //printf("%d\n",*p);

    return *p==0x34;    

} 
复制代码

很显然,若是小端模式,指针p指向的单元里面的数据整型值必为0x34,否则为0x12。

测试程序:

复制代码
/*测试系统大端模式/小端模式 2011.10.1*/ 



#include <iostream>

using namespace std;



typedef union 

{

    char a;

    short c;

}U;



int checkCPU1()  //若是小端则返回1,否则返回0 

{

    U u;

    u.c=1;

    //printf("%d\n",u.a);

    return u.a==1;

}



int checkCPU2()

{

    short a=0x1234;

    char *p=(char *)&a;

    //printf("%d\n",*p);

    return *p==0x34;    

} 



int main(int argc, char *argv[])

{

    printf("%d\n",checkCPU1());

    printf("%d\n",checkCPU2());

    return 0;

}
复制代码
作者: 海子
         
本博客中未标明转载的文章归作者 海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

你可能感兴趣的:(转载)