大小端模式出现是为了兼容不同CPU采用的不同的指令集
PowerPC架构和x86架构采用的是不同的CPU指令集。PowerPC采用精简指令集(RISC,reduced instruction set computer),x86指的是特定微处理器执行的一些计算机语言指令集。
PowerPC :大端模式
x86:小端模式
高位字节、低位字节
通常从最高有效位开始自左向右书写一个数字。
在理解有效位这个概念时,可以想象一下你的支票数额的第一位增加1和最后一位增加1之间的巨大区别,前者肯定会让你喜出望外。
计算机内存中一个字节的位相当于二进制数的位,这意味着最低有效位表示1,倒数第二个有效位表示2×1或2,倒数第三个有效位表示2×2×1或4,依此类推。如果用内存中的两个字节表示一个16位的数,那么其中的一个字节将存放最低的8位有效位,而另一个字节将存放最高的8位有效位,见图。
存放最低的8位有效位的字节被称为最低有效位字节或低位字节,而存放最高的8位有效位的字节被称为最高有效位字节或高位字节。
个人理解:左边是高字节、右边是低字节
大端、小端
大端模式:高位字节排放在内存的低地址端,低位字节排放在内存的高地址端
小端模式:低位字节排放在内存的低地址端,高位字节排放在内存的高地址端
简单来说:大端—高尾端,小端—低尾端
举个例子,比如数字 0x12 34 56 78在内存中的表示形式:
1)大端模式:
低地址 -----------------> 高地址
0x12 | 0x34 | 0x56 | 0x78
2)小端模式:
低地址 ------------------> 高地址
0x78 | 0x56 | 0x34 | 0x12
个人理解:大端正常,小端翻转
3)下面是两个具体例子:
16bit宽的数0x1234在Little-endian模式(以及Big-endian模式)CPU内存中的存放方式(假设从地址0x4000开始存放)
内存地址 | 小端模式存放内容 | 大端模式存放内容 |
---|---|---|
0x4000 | 0x34 | 0x12 |
0x4001 | 0x12 | 0x34 |
32bit宽的数0x12345678在Little-endian模式以及Big-endian模式)CPU内存中的存放方式(假设从地址0x4000开始存放)
内存地址 | 小端模式存放内容 | 大端模式存放内容 |
---|---|---|
0x4000 | 0x78 | 0x12 |
0x4001 | 0x56 | 0x34 |
0x4002 | 0x34 | 0x56 |
0x4003 | 0x12 | 0x78 |
4)大端小端没有谁优谁劣,各自优势便是对方劣势:
小端模式 :
- 强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样
强制类型转化,如int(4字节)转化成short(2字节),直接可以取出前面的低位两字节 - CPU计算是从数据的低位到高位计算,效率高
所以当CPU从地址的低位到高位移动的时候,正好数据也是从地位到高位变化,计算高效
大端模式 :
- 符号位的判定固定为第一个字节,容易判断正负
大端模式中地址的变化顺序(低到高)与数据的阅读顺序(高位到低位,如12345678我们会从高位开始读,即从左到右)相吻合。所以当沿着地址空间找到某个数据内存的时候,我们首先就可以根据他的内容的第一个字节来判断正负