大小端判断

来源:互联网 发布:男生手提包 知乎推荐 编辑:程序博客网 时间:2024/05/17 23:10

引言

考虑一个32位整数,它由4个字节组成。内存中存储这个4个字节由两种方法:大端字节序,小端字节序;

概念

小端字节序:将低序字节存储在起始地址,称为小端字节序;

大端字节序:将高序字节存储在起始地址,称为大端字节序;

图示

如果定义一个int类型的整数,将0x12345678赋值给这个整数,这个整型变量采用大端模式或小端模式在内存中的存储如下图所示:

地址偏移量大端模式小端模式0x000000010x120x780x000000020x340x560x000000030x560x340x000000040x780x12

如上表所示,采用大小端模式对数据进行存放主要区别在于存放的字节顺序:大端模式将高序字节存放在低地址,小端模式将高序字节存放在高地址;

代码区分

1. 直接判断法

union:所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。

我们可以利用union的特性来判断大小端;思路如下:往a成员赋值,然后读取b就相当于读取a成员的低位第一个字节的值。如果机器使用大端模式,则u.a=1那a的最高字节值为1;如果机器使用小段模式,则u.a=1则a的最低位字节为1。上述可知b和a有相同的起始位,所以读取b如果等于1,则为小端模式,b为0则为大端模式;

typedef union {      short i;      char c;  }testUnion;      int checkSystemUnion(void)  {      testUnion objTestUnion;      objTestUnion.i = 1;      return (objTestUnion.i == objTestUnion.c);  }  


2. 联合区分发

我们初始化了一个int变量i为0x12345678,,该变量地址为0x00000001;根据大小端定义可知:在小端模式下,0x00000001一个字节内的值为0x78,类推0x00000002=0x56,0x00000003=0x34,0x00000004=0x12,根据这个编程如下:

int checkSystem(void)  {     int i = 0x12345678;     char *c = &i;     return ((c[0] == 0x78) && (c[1] == 0x56) && (c[2] == 0x34) && (c[3] == 0x12));  }  

0 0