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:当然以上是我个人的记忆方式,如果有不对的地方,欢迎举反例批评。