本文主要是关于一个由“大小端”引发的问题的具体分析。
笔者在百度知道看到一个提问,内容如下:
为什么此函数输出 moring? s=&x是为什么呢?
引用自:http://zhidao.baidu.com/question/545637515.html?fr=uc_push&push=&group=1
#include <iostream>
using namespace std;
int main(){
union{
char word[8];
short int ksi[5];
}x,*s;
s=&x;
s->ksi[0]=0x4f43;
s->ksi[1]=0x504d;
s->ksi[2]=0x5455;
s->ksi[3]=0x5245;
s->ksi[4]=0x0021;
cout<<s->word<<endl;
return 0;
}
下面是由这个问题,而引发的笔者的思考:
首先,这个问题很明显是关于“大小端”的问题,即“BigEndian” 和 “SmallEndian”。
关于大小端的问题,在笔者转载的另一篇文章中,已经有较详细的解说(http://blog.csdn.net/it1988888/article/details/7765997)。
但是,把“大小端”的问题具体化到这个百度知道的问题上,主要有2点总结要说:
一是,所谓的“小端Little-Endian”,就是“低地址存放最低有效位(LSB),既低位字节排放在内存的低地址端,高位字节排放在内存的高地址端”。同理,“大端”的解释反之;
二是,Intel X86平台采用Little Endian,而PowerPC处理器则采用了Big Endian。
如果明白了上面两点总结,那么这个问题就迎刃而解了。
首先可以确定的是,百度知道上这个问题的提问者用的十有八九是x86的计算机(否则,如果提问者用的是诸如PowerPC等的大端模式的计算机,那么那个字符串或称字符数组就没有具体的英文意义了)。
其次,回上程序上来看,程序中有一个联合体Union,该联合体中的word数组和ksi数组的指针指向同一段内存空间,即共享同一段存储空间。
把两个数组分别展开,如下所示:
----------------------------------------------------------------------------------------------------------------------------------------------------
MemoryAddress: Low --> High
----------------------------------------------------------------------------------------------------------------------------------------------------
ksi[x]: 0 1 2 3 4
(Value) 0x4f43 0x504d 0x5455 0x5245 0x0021
----------------------------------------------------------------------------------------------------------------------------------------------------
word[y]: 0 1 2 3 4 5 6 7 8
(Value) 0x43 0x4f 0x4d 0x50 0x55 0x54 0x45 0x52 0x21
----------------------------------------------------------------------------------------------------------------------------------------------------
ASCII: C O M P U T E R !----------------------------------------------------------------------------------------------------------------------------------------------------
由上表可知,最终程序打印出来的字符串是“COMPUTER!”,而非提问者所说的“moring?"。所以说,做学问应该要有严谨的科学方法,经过严谨推论得出的结论,是不因为他人的其它说法而动摇的而且是符合真理和科学的结论。
回到问题的解答上,其中word数组与ksi数组共享同一段存储空间,以ksi[0]为例,它所指向的存储空间中有2个字节的容量,这2个字节的空间中,即存储着word[0]的值,同进度也存储着word[0]和word[1]的值,然后从前面已知x86系统中是“小端模式存储方式”,那么ksi[0]中低字节的一半值0x43就应该存储在相对低地址的空间中,恰巧这个相对低地址的空间也被word[0]共享;而高字节的一半值0x4f就应该存储在相对高地址的空间中,这个相对高地址的空间也被word[1]共享。同理可得这两个数组中其它地址中相对应的值,最终经常在x86系统中运行验证,的确打印出来的信息就是字符串“COMPUTER! "。