以32位机来讲,比如有这样一个整形数0x11223344,假设从内存0x0地址开始存放这个数。
对于大端模式(Big endian),低地址存放高字节。所以0x11223344在内存中的存放如下:
0x00:0x11
0x01:0x22
0x02:0x33
0x03:0x44
而对于小端模式(Little endian),低地址存放低字节。所以0x11223344在内存中的存放和大端是相反的:
0x00:0x44
0x01:0x33
0x02:0x22
0x03:0x11
相信大家对这个知识点都比较熟悉,不过稍微想想,马上又会觉得干嘛要弄两种不同顺序的存放方式呢?(遵循不讲故事只讲事实的原则,这里不再赘述其来由)
容易想到的问题是:存放方式不同,读取出来的时候会不会出错呢?读取一个字节得到的值是什么?读取两个字节呢?读取四个字节呢?
首先,变量的地址都是变量存放的低地址,不论大端还是小端,如果有int ByteOrder= 0x11223344,我们假设变量ByteOrder在内存中的地址为0x00,那么不论读取一个字节还是四个字节,都会从内存的0x00地址处开始读取。
大端模式:一次读取四个字节,很显然我们取回来的是数应该是0x11223344。取两个字节(我们可以这样写代码:short b = (*(short *)&ByteOrder),再打印b的值就成了):0x1122。取一个字节:0x11。
小端模式:同样一次读取四个字节,我们得到的肯定也是0x11223344。而读取两字节:0x3344。取一个字节:0x44。
所以现在摆在我们面前的主要有两个问题:
1. 取一个/两个字节的时候,大小端取出来的值不同,但是当按四个字节取出来的时候,又相同了,这是为什么呢?
2.上面是用指针的方式取值的,如果改成强制转换,比如short b = (short)ByteOrder,值又是什么呢?