首先,介绍一下大小端:
数据在存储器中存储时有大小端之分,大端表示数据的高字节在低地址,低字节在高地址;小端表示数据的高字节在高地址,低字节在低地址(当一个完整的数据超过一个字节时才需要考虑数据的大小端)。
Big-Endian: 低地址存放高位,如下:
高地址
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
低地址
---------------
buf[3] (0x78) -- 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 高位
---------------
低地址
Little-Endian: 低地址存放低位,如下:
高地址
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
---------------
buf[3] (0x12) -- 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 低位
下面用两个方法说明如何测试大小端,代码如下:
(intel处理器是小端的)
typedef union _TestStruct{
struct{
unsigned char a;
unsigned char b;
}a_b;
unsigned short int ab;
}TestStruct;
//方法一
int func1(void)
{
TestStruct test;
test.ab = 0x1234;
if(test.a_b.a == 0x12)
{
printf("big endian\n");
}
else if(test.a_b.a == 0x34)
{
printf("little endian\n");
}
else
{
printf("test error\n");
}
return 0;
}
//方法二
int func2(void)
{
unsigned short int a = 0x1234;
unsigned char b = *(unsigned char*)&a;
if(b == 0x12)
{
printf("big endian\n");
}
else if(b == 0x34)
{
printf("little endian\n");
}
else
{
printf("test error\n");
}
return 0;
}
int main(int argc, char *argv[]) {
func1();
func2();
return 0;
}