前言
前段时间迷上了物联网,搞了一个控制硬件开关的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 | 高 |
那么结果就呼之欲出了:
-
前一种内存的低位和数字的高位对齐,叫做:大端对齐;
-
后一种内存的低位和数字的低位对齐,叫做:小端对齐;
值得注意的是,不同的操作系统对齐方式不同,在进行数据通讯时需要统一转为为约定格式,避免鸡同鸭讲。
最后在送大家一个记忆的妙法:
小弟弟:(小低低)小端对齐是:低地址和低位对齐;另一个就是大端对齐。