1.1 大小端概念
大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中。
小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来。
我们常用的 X86
结构是小端模式,而 KEIL C51则为大端模式。很多的ARM,DSP 都为小端模式。
有些ARM处理器还可以随时在程序中(在ARM Cortex 系列使用REV、REV16、REVSH 指令 [1] )进行大小端的切换。
1.1.1大小端判断方法一
#define TRUE 1
#define FALSE 0
int is_bigendian()
{
int i = 1; // i = 0x00000001
char c = *(char *)&i; // 注意不能写成 char c = (char)i;
return (int )c != i;
}
如果是 little endian 字节序 i = 1
;的内存从低到高依次放的是:0x01 0x00 0x00 0x00
,
按照 i 的起始地址变成按照 char *
方式(1字节)存取,从低地址开始取值,即得 c = 0x01
;反之亦然。
1.1.2 大小端判断方法二
C 中 union
里面的成员char c
和 int i
都是从低地址开始对齐的,所以如果是小端模式低地址的值为 0x2
, 若果是大端模式低地址的值是 0x0
。
int is_bigendian()
{
union {
int i;
char c;
} test;
test.c = 0x2;
return test.i != 2; //不等于2,返回true,是大端模式
}