所谓的大端模式,是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在大端模式下,前16位应该这样读: e684
记忆方法: 地址的增长顺序与值的增长顺序相反
小端模式
所谓的小端模式,是指数据的高位保存在内存的高地址中,而数 据的低位保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在小端模式下,前16位应该这样读: 84e6
记忆方法: 地址的增长顺序与值的增长顺序相同
版本一:
/* File name : Endian.c Version : 0.0.1 Author : LiMing Date : 2012-02-25,19:14,Saturday Descriptioin: Test whether the user's compute architecture is big-endian or little-endian Test environment: Dev-C++ 5.1.0.0 Test result: The x0 = 0x22 The x1 = 0x11 shows that the x86 architechture is little-endian */ #include <stdio.h> union data { int inter; char ch; }; int main(void) { union data c; c.inter = 1; if(c.ch == 1) printf("The compute is little-endian.\n"); else printf("The compute is big-endian,\n"); getchar(); return 0; }
版本二:
/* 0x3839 little endian */ #include <stdio.h> #include <stdlib.h> #include <string.h> union AA { int i; char a[2]; }; int is_little_endian() { union check { int i; char ch; }c; c.i = 1; return (c.ch == 1); } int main() { int ret; union AA *p, u; p = &u; memset(&u, 0, sizeof(union AA)); p->a[0] = 0x39; p->a[1] = 0x38; printf("0x%x\n", p->i); if(is_little_endian()) { printf("little endian!\n"); } else { printf("big endian!\n"); } getchar(); return 0; }
版本三:
/* File name : endian02.c Version : 0.0.1 Author : LiMing Date : 2012-02-26,10:40,Sunday Descriptioin: Use keyword 'union' to test whether the user's compute architecture is big-endian or little-endian Test environment: Dev-C++ 5.1.0.0 Test result: The compute is little-endian. */ #include <stdio.h> int main(void) { short int x; char x0,x1; x = 0x1122; x0 = ((char *)&x)[0]; x1 = ((char *)&x)[1]; printf("The x0 = 0x%x\n",x0); printf("The x1 = 0x%x\n",x1); getchar(); return 0; }
版本四:
/* File name : Endian01.c Version : 0.0.2 Author : LiMing Date : 2012-02-25,19:14,Saturday Descriptioin: Use keyword 'union' to test whether the user's compute architecture is big-endian or little-endian Test environment: Dev-C++ 5.1.0.0 Test result: The compute is little-endian. */ #include <stdio.h> #include <stdlib.h> union data { short inter; char ch; }; int main(void) { union data c; c.inter = 0x1122; if(c.ch == 0x22) printf("The compute is little-endian.\n"); else printf("The compute is big-endian,\n"); getchar(); return 0; }