大小端模式

  https://www.cnblogs.com/little-white/p/3236548.html

一 大端模式就是高位存在低地址(看着顺序一致),例如0X1234,内存地址是0X4000的话,0x4000=0x12;0x4001=0x34;

大端模式一般存在网络协议和MODBUS(先发高字节再发低字节)等中,符号位的判定固定为第一个字节,容易判断正负;C51也是大端模式。

小端模式常存在于处理器中,如ARM中,强制转换数据不需要调整字节内容,如果要进行MODBUS打包数据则要进行高低字节交换。

所以向eeprom中存入字节序按大端存储:keil下的u16先进行高低字节转换__REV16(A),然后进行强制类型转换拷贝写入;读出时先读到一个将u16数组地址强制转换字节指针中,然后进行对u16进行__REV16(A)转换。

modbus协议栈自动会将大端序的字节流存储到小端模式的keil下的u16中,发送时会将小端模式的u16进行高低字节转换成大端序字节流发送。

#define BigtoLittle16(A)   (( ((uint16)(A) & 0xff00) >> 8) | (( (uint16)(A) & 0x00ff) << 8))或者用专门的汇编指令:
#define Little16toBig(A)  __REV16(A)

大小端的判断:可以用将16bit数据强制按字节访问低字节内容,如果等于高位字节值则为大端,否则小端
       或者用共用体union来访问16bit和8bit内容,判断方法一样
举例说明:u8 a[4]={0xc0,0xa8,0x1,0xfa};
u8 b[2]={0x1234,0x5678};
memcpy(b,a,4);//此时b[2]={0xac0,0xfa01};
memcpy(a,b,4);//a[4]={0x34,0x12,0x78,0x56};
 



原文地址:https://www.cnblogs.com/jieruishu/p/10893221.html