大端模式:数据的高位保存在低地址,数据的低位保存在高地址。
例如,数据0x12345678大端的存储模式如下
地址 数据
0x00000001 0x12
0x00000002 0x34
0x00000003 0x56
0x00000004 0x78
小端模式:数据的高位保存在高地址,数据的低位保存在低地址。
例如,数据0x12345678小端的存储模式如下
地址 数据
0x00000001 0x78
0x00000002 0x56
0x00000003 0x34
0x00000004 0x12
速记法1:大端按照数字的书写顺序进行存储,小端颠倒书写顺序进行存储。
速记法2:首地址存储的高位是大端,首地址存储的低位是小端。
优缺点:
小端模式 :强制转换数据不需要调整字节内容,可以定义指针直接从字节流中获取整型等其它类型的数据。
大端模式 :符号位的判定固定为第一个字节,容易判断正负。
判断机器字节序的方法:
bool is_big_endian(void)
{
int ret_val = 1;
if(((char*)&ret_val)[(sizeof(int) - 1)] == 1){
return true;//大端
}else{
return false;//小端
}
}
一般操作系统都是小端,而通讯协议是大端的。
大小端的转化方法:
16位数:#define big_to_little16 (a) ((( (unsigned short)(a) & 0xFF00) >> 8) | (( (unsigned short)(a) & 0x00FF) << 8))
32位数:#define big_to_little32 (a) ((( (unsigned int)(a) & 0xFF000000) >> 24) | \
(( (unsigned int)(a) & 0x00FF0000) >> 8) | \
(( (unsigned int)(a) & 0x0000FF00) << 8) | \
(( (unsigned int)(a) & 0x000000FF) << 24) )