字节序(byte order)、比特序(bit order)、MSB/LSB、大端模式/小端模式 概念误混淆

发现之前概念一直混淆,今天就理清楚以作备忘。

前提:内存的读写永远从低地址开始读/写,从低到高!从低到高!从低到高!

内存的读写永远从低地址开始读/写!!!

1、字节序(byte order)、比特序(bit order)

字节序就是串行发送多字节时发送的顺序,比如a=0x12345678,按字节发送是0x12 0x34 0x56 0x78顺序还是0x78...0x12顺序

比特序同理但在bit层面进行排序,如果一个字节,指先发bit0 还是bit7, 如果是一个Word型,先发bit31还是先发bit0

串口是LSB优先,I2C是MSB优先,这里的MSB、LSB指的是比特序,二进制位的位置,区别于【字节序】(通信中,先发送低

字节,还是高字节的问题,那是字节序的MSB还是LSB,但也有人混叫为大端发送big-endian、小端发送little-endian)

2、大端(big-endian)和小端(little-endian)

大端模式和小端是实际的字节顺序和存储的地址顺序对应关系的两种模式,总结如下:

大端模式:低地址对应高字节

小端模式:低地址对应低字节(小端低-低顺着来,x86、ARM都这么搞)

不管是大端还是小端模式,我们在读取和存储数据的时候一定都是从内存的低地址依次向高地址读取或写入。

另外注意,x86平台是小端的,ARM平台是小端的,而PowerPC平台是大端的

这里写图片描述这里写图片描述

                                图1-大端模式存储                                                        图2-小端模式存储

3、高位先行MSB(the most significant bit) 、低位先行LSB(the least significant bit)

简单说就是串行数据传输中先发高位,还是先发低位,MSB就是先发高位,而不同的地方指代的含义不一样才导致混淆,这个在1中字节序、比特序就做介绍了。

4、如何验证PC机,ARM,或其他MCU平台存储方式?

以下代码如果打印0x78就是小端存储,如果0x12则是大端存储

#include <stdio.h>
void main(void)
{
	int data = 0x12345678;
	char *p = (char*)&data;
	printf("%#x\n", data);
	printf("%#0.8x\n", *p);

	getchar();
}

 

总结:大小端存储指字节在内存存储方式,X86、ARM平台都是小端存储(低-低),MSB/LSB只发送字节序或者比特序,串口是比特序LSB,IIC是比特序MSB。最后也有人将MSB、big-endian、大端发送都混为一谈,这时候一般指字节序上MSB。

  • 13
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值