首先,大端(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