最近准备写点底层的东西,正好遇到大端模式和小端模式,在实际的开发中,尤其是C系语言的开发中用得到,所以就记录一下。
先说一下概念,一般我们现在所用的操作系统,大多数都是小端模式的,小端模式就对于一个数字来说,低位的数字保存在低地址的内存中,高位的数字保存在高地址的内存中,大端模式则相反。下面看下例子。

比如定义a,十六进制为1234,对于这个数字来说,1是高位,4是低位。一个int是32位,又由于一个十六进制数是占4位,所以这个数字如果用二进制表示为:
0000,0000,0000,0000,0001,0010,0011,0100,下面我们看下内存中表示:

箭头所指的就是这个数在内存中的表示方式,内存地址左边为低地址,右边为高地址,这个内存是用16进制表示,2个数字就是8位,代表一个字节,内存中一般最小单位都是用字节来表示,所以就是8位一个单位,上面的二进制数8位一组的话,就是(00,00,12,34),在按照小端模式保存就是34,12,00,00了。
在来看一个数组
```
int arr[] = {0x11,0x22,0x33,0x43,0x52,0x67};
```
这里有6个数,都是int的,所以每个数都是32位,按照上面说的8位一组0x11展开就是(00,00,00,11)小端模式的话,就是(11,00,00,00),其余的如下图所示:

可以看到都是这样的规则,我们再来看下面的代码:
```
char arr[] = {0x11,0x22,0x33,0x43,0x52,0x67};
printf("%x\n",*(int *)(arr+3));
```
首先是一个char类型的数组,里面也是一样的6个数字,由于char类型是一个字节,也就是8位,所以我们先看下内存中的表示:

可以看到char由于只有一个字节,所以一个数组元素就只占8位,6个就是6个字节。然后我们地址往后偏移3个后,int指针取出,由于一个int是4字节,那么等于我们取出数组后面3个元素再要外加一个字节(这里指针越界产生安全问题不考虑),我们从图上看,考虑下最后的值是多少? <br>
675243<br>
为什么是这个呢?可以这样考虑,偏移3个后,内存中取出4个字节的值,从图中看就是43,52,67,00,由于是小端模式,那么就是00675243,去掉高位0,那么就是675243了,这个值也是根据小端模式来读取的。
大小端模式