1、大小端定义
1.1、大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。地址由小向大增加,而数据从高位往低位放。
大端模式eg:
unsigned int value = 0x12345678;
unsigned char buf[4] = {0};
高地址
--------------
buf[3] (0x78) -- 数据低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) -- 数据高位
--------------
低地址
1.2、小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
小端模式eg:
unsigned int value = 0x12345678;
unsigned char buf[4] = {0};
高地址
--------------
buf[3] (0x12) -- 数据高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) -- 数据低位
--------------
低地址
2、为什么有大小端
这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节(8bit)。对于位数大于 8位的处理器,例如32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就出现了大端存储模式和小端存储模式。
3、测试大小端代码
void func(void)
{
int x = 1;
if (1 == *(char*)&x)
{
printf("little - endian\n");
}
else
{
printf("big - endian\n");
}
}
4、大小端转化代码
#define UINT unsigned int
#define BSWAP_32(x) \
(UINT)((((UINT)(x) & 0xff000000) >> 24) | \
(((UINT)(x) & 0x00ff0000) >> 8) | \
(((UINT)(x) & 0x0000ff00) << 8) | \
(((UINT)(x) & 0x000000ff) << 24) \
)
#define USHORT unsigned short
#define BSWAP_16(x) \
(USHORT)((((USHORT)(x) & 0xff00) >> 8) | \
(((USHORT)(x) & 0x00ff) << 8)\
)