今天找了一整天的资料,企图弄懂大小端模式的区别,但是弄了很久还是弄不懂。后面尝试从内存中的分配格局来区别,找了大、小端模式下的内存分配格局进行比较,就弄懂了。
先贴出基本知识:
所谓的大端模式Big-endian,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
所谓的小端模式Little-endian,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。
下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:
short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //低地址单元
x1=((char*)&x)[1]; //高地址单元
cout << hex << (int)x0 << endl;
若x0=0x11,则是大端;
若x0=0x22,则是小端;
上面的程序还可以看出,数据寻址时,用的是低位字节的地址。
下面我们贴出2张图来从内存分配格局区别大小端模式
第一张图是小端模式下的内存分配格局:
第二张图是大端模式下的内存分配格局:
仔细看其实大小端模式下内存的分配格局就在于:
栈在高位内存还是低位内存往下延伸(本人文采不好,但愿你们能根据图理解)
如果高地址在上,那么就是小端模式(我的计算机就是小端模式,所以我下个推论-一般PC机都是小端模式,因为小端模式下PC容易对数据进行处理