简单来说,从内存地址增加的方向来说,大端就是先存放高序字节,小端就是先存放低序字节。
例如:0x0102
-------->内存增加的方向------>
地址A------>地址A+1
大端:01 02
小端:02 01
判断方法是利用union的一个特性,那就是里面的变量共享一段内存。
可以定义一个union.
union Test{
short num;//2byte
char c[sizeof(num)];//2byte
} ;
然后存入一个0x0102或者其他数字到test.num中,因为共享内存的原因,可以访问c[1],c[2],查看里面的值来判断大小端。
一个实现是(参照unix网络编程中的一个例子):
[cpp] view plain copy print?
#include
#include
union Test{
short num;
char c[sizeof(short)];
};
int main()
{
union Test t;//C++ 直接声明为Test t即可
t.num=0x0102;
if(t.c[0]==1&&t.c[1]==2)
printf("大端!\n");
else if(t.c[0]==2&&t.c[1]==1)
printf("小端!\n");
else
printf("未知!\n");
getch();
return 0;
}
在Win7 32bit里面用DEV c++运行的结果为:
或者更简单的是存一个short值,然后取其地址。
[cpp] view plain copy print?
#include
#include
int main()
{
short int num=0x0201;
char *p=#
if(*p==0x02)
printf("大端!\n");
else if(*p==0x01)
printf("小端!\n");
else
printf("未知!\n");
getch();
return 0;
}
测试结果: