前言

前段时间迷上了物联网,搞了一个控制硬件开关的demo。在阅读硬件通讯协议(MODBUS)时,经常看到大端对齐和小端对齐,一脸懵逼,今天终于搞懂了。

什么是大端对齐和小端对齐?

要想搞清楚这个问题,我们需要先搞清楚两个概念:低(高)地址和低(高)位。

低地址(栈顶)和高地址(栈低)

程序运行时的数据需要一个载体来存储,一般是虚拟内存。 我们可以把虚拟内存比作一个有页码的作业本,按照0x00001-0x000100的顺序编号。那么,类比到计算机中,序号小的页码0x00001对应低地址,序号大的页码0x000100对应高地址。

低位和高位

低(高)位的概念容易与低(高)地址弄混,他其实是由我们的阅读习惯决定的。 例如‘1234’,我们理解它的语义为“一千二百三十四”,而不是反过来“四千三百二十一”。这是因为我们的阅读习惯是从左到右,而非从右往左。对应的,1就是高位,4就是低位。这样说好理解吧?

王八的屁股——规定

还回到作业本的例子,假设我们再每一页上写一个数字,有的同学喜欢按照顺序从前往后写子,用完第一页再用第二页,具体为:

内存数据 内存地址 存储内容 数字顺序
0x00001 1
0x00002 2
0x00003 3
0x00004 4

还有同学喜欢从后往前写,具体为:

内存数据 内存地址 存储内容 数字顺序
0x00001 4
0x00002 3
0x00003 2
0x00004 1

那么结果就呼之欲出了:

  • 前一种内存的低位和数字的高位对齐,叫做:大端对齐

  • 后一种内存的低位和数字的低位对齐,叫做:小端对齐

值得注意的是,不同的操作系统对齐方式不同,在进行数据通讯时需要统一转为为约定格式,避免鸡同鸭讲。

最后在送大家一个记忆的妙法:

小弟弟:(小低低)小端对齐是:低地址和低位对齐;另一个就是大端对齐。

参考

https://zhidao.baidu.com/question/1900511789089474940.html