关于大小端模式,该怎么记忆

1.大与小,说的是什么

大与小,实际上说的是位权值,也就是说字节顺序问题,是由数学中,自然数的书写模式的规律,扩展延伸类比而来的。
例如:
       2018这个十进制多位自然数的书写,是从左到右的。
       2018 = 2*1000 + 0*100 + 1*10 +8*1

其中2这个数字,(从左到右是第1位)也叫千位,千位的位权是1000;在这个自然数中,千位的位值是(2*1000)2000;各位的位值相加,就是这个数实际所代表的数值。

从上面这个例子中,我们可以得出一个结论,以这种从左到右的自然数书写方式为标准,面对多位数,位权大的数字是排在位权小的数字之前的

2.十六进制也符合这样的规律

例如:
       214(16进制)这个数。逢16进一。
        0x214 = 2*(16^2) + 1*(16^1) + 4*(16^0) = 532(十进制)。
       下列全是代表16进制的数字,就不加0x符号说明了
       (注意:十进制中用符号“10”代表10;而十六进制中用符号“10”代表16)
       (注意:10最好读成“一零”,而不要读成“十”,避免跟十进制混淆)
         214 = 2*(10^2) + 1*(10^1) + 4*(10^0)
        2A4 = 2*(10^2) + A*(10^1) + 4*(10^0) = 200 + A0 + 4
仍然是位权大的数字是排在位权小的数字之前的

3.来看看大端模式

因为4个bit位的二进制数,刚好能够表示15个十六进制符号,而一个字节占8bit位,所以计算机中用2个十六进制数字表示一个字节。内存中是按字节排列的,根据上节对十六进制数字的位权分析。我们进而推演类比到字节顺序。我们可以把一个字节想象成一个数字。
以0x12345678这个4字节数据举例:假设地址从0x4000起,地址编号开始累加上涨。

名称
内存地址 0x4000 0x4001 0x4002 0x4003
数据 0x12 0x34 0x56 0x78

显然地,0x12位权最大,0x78位权最小。
这里我避免使用高地址和低地址这样的概念,避免混淆。
设定内存总是如上表从左到右(地址编号由小到大)填入字节数据。
也就是说位权大的排列在位权小的字节之前,称之为大端模式

4.再看看小端模式

仍然以0x12345678这个4字节数据举例:假设地址从0x4000开始

名称
内存地址 0x4000 0x4001 0x4002 0x4003
数据 0x78 0x56 0x34 0x12

显然地,0x12位权最大,0x78位权最小。
设定内存总是如上表从左到右(地址编号由小到大)填入字节数据。
也就是说位权小的排列在位权大的字节之前,称之为小端模式

5.更通俗一点

大端模式是按照数字的书写顺序进行存储的,而小端模式是颠倒书写顺序进行存储的

有些人在解析大小端的时候,往往会加入高地址,低地址,地址高端,地址低端这样的概念。但是字节按大小端顺序往内存中放,对于地址来说,我们应该谈先后顺序,而不是哪一端,很容易记忆混淆。我很不喜欢这样的解读方式。
Note:当然以上是我个人的记忆方式,如果有不对的地方,欢迎举反例批评。

你可能感兴趣的:(c++)