现在的位置: 首页 > 架构设计 > 正文

大端和小端是什么意思

2020年02月05日 架构设计 ⁄ 共 1132字 ⁄ 字号 评论关闭

  嵌入式开发者应该对大端和小端很熟悉。在内存单元中数据是以字节为存储单位的,对于多字节数据,在小端模式中,低字节数据存放在低地址单元,而在大端模式中,低字节数据存放在高地址单元。比如一个定义一个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

  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;

  }

  以上就是有关大小端的介绍,更多知识请关注学步园。

抱歉!评论已关闭.