首先,大端(big-endian)还是小端(little-endian)是相对于一个字来说的,指在一个字中各个字节的顺序。
如int x = 0x04030201:
若是在小端机器中,字节01存放的位置是内存中的低地址,也就是说低位存放在低地址;
若是在大端机器中,字节01存放的位置是内存中的高地址,也就是说低位存放在高地址。
具体可以通过简单的测试程序来测试
code 1:
#include <stdio.h>
int main(void)
{
int x = 1;
if (*(char *)(&x) == 1)
{
printf("Little-Endian!\n");
}
else
{
printf("Big-Endian!\n");
}
return 1;
}
x86机器中会打印Little-Endian!
code 2:(endian_2.c)
#include <stdio.h>
typedef struct tmp
{
char a;
char b;
char c;
char d;
}stEndTest;
typedef union endtest
{
int int_;
stEndTest stEndTest_;
}unEndTest;
int main(void)
{
unEndTest tmp;
tmp.int_ = 0;
tmp.stEndTest_.a = 1;
tmp.stEndTest_.b = 2;
tmp.stEndTest_.c = 3;
tmp.stEndTest_.d = 4;
printf("tmp.stEndTest_.a addr:%x and a:%d\n", (int)&tmp.stEndTest_.a, tmp.stEndTest_.a);
printf("tmp.stEndTest_.b addr:%x and b:%d\n", (int)&tmp.stEndTest_.b, tmp.stEndTest_.b);
printf("tmp.stEndTest_.c addr:%x and c:%d\n", (int)&tmp.stEndTest_.c, tmp.stEndTest_.c);
printf("tmp.stEndTest_.d addr:%x and d:%d\n", (int)&tmp.stEndTest_.d, tmp.stEndTest_.d);
printf("tmp.int_:%x\n", tmp.int_);
return 1;
}
测试如下:
[root@zx ARM_Test]# gcc -Wall -o endian_test_2 endian_2.c
[root@zx ARM_Test]# ./endian_test_2
tmp.stEndTest_.a addr:bf9be370 and a:1
tmp.stEndTest_.b addr:bf9be371 and b:2
tmp.stEndTest_.c addr:bf9be372 and c:3
tmp.stEndTest_.d addr:bf9be373 and d:4
tmp.int_:4030201