一、什么是大端 Or 小端?
在直接对内存操作的时候,知道所使用CPU存放数据顺序是非常重要的,尤其是存取网络数据的时候。一般有两种顺序 Big endian(大端模式),一种是Little endian(小端模式)。大端模式就是将一个数据的低字节数据放在内存中的高地址中;小端模式与之相反是将低字节数据放在内存的低地址中。比如,一个数据0x1234,存放在起始地址为0x0000的内存中,其中0x34是低字节数据,0x12是高字节数据,
如果是大端模式,存放顺序为:
0x0000 0x0001
0x12 0x34
小端模式存放顺序为:
0x0000 0x0001
0x34 0x12
一般说来,x86的cpu都是小端模式,PowerPC都是大端模式,而有的CPU可以通过设置来确定是工作于大端还是小端模式。那么,怎么确定一个系统是大端模式,还是小端模式呢?
二、如何判断大端 Or 小端 ?
一般有两种方法,其一,就像上文所描述的顺序一样,我们把一个数据0x1234赋值给一个unsigned int 类型变量temp,这个temp变量有两个字节数据存放在相应的两个内存地址中,然后,我们把temp变量的首地址赋值给一个char 类型的变量,在读取这个char变量,看看这个char变量的值是0x12还是0x34,这样不就很容易的判断出是大端还是小端模式了么?如果是0x34那么无疑是小端模式,如果是0x12那么就是大端模式。
验证代码如下:
#include <stdio.h>
int main()
{
unsigned int temp =0x1234;
char *p =NULL;
p =(char *) &temp;
if(*p == 0x12)
{
printf(" It is Big-endian \n");
}
else if(*p ==0x34)
{
printf("It is Little-endian\n");
}
return 0;
}
其二,利用union数据类型的特性,我们都知道union中的数据是从低地址向高地址存放的,而且其数据成员是共享内存的,也即是,如果还有两个数据成员,一个int类型,一个char类型,它们是存放在同一个内存地址的。那么我们可以进行如下验证:
#include <stdio.h>
int main()
{
printf("使用union数据类型,验证系统的模式 !\n");
union endian
{
int a;
char b;
}temp;
temp.a = 0x1234;
printf("temp.b = %x\n",temp.b);
if(temp.b ==0x34)
printf("It is Little-endian !\n");
else
printf("It is Big-endian !\n");
return 0;
}