首页 > 代码库 > 从内存中堆栈的分配格局解析大小端模式
从内存中堆栈的分配格局解析大小端模式
今天找了一整天的资料,企图弄懂大小端模式的区别,但是弄了很久还是弄不懂。后面尝试从内存中的分配格局来区别,找了大、小端模式下的内存分配格局进行比较,就弄懂了。
先贴出基本知识:
所谓的大端模式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容易对数据进行处理)。
如果低地址在上,那么就是大端模式。
好,那有了上面的推论我们来看2个例子。
例子1:
16bit宽的数0x1234
在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址 | 0x4000 | 0x4001 |
存放内容 | 0x34 | 0x12 |
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 | 0x4000 | 0x4001 |
存放内容 | 0x12 | 0x34 |
解析:小端模式下,因为高地址在上,所以栈往低地址处延伸。所以先把34(先来者)往低地址处压栈,再把12(后来者)往高地址处压栈
大端模式下,因为低地址在上,所以栈往高地址处延伸。所以先把34(先来者)往高地址处压栈,再把12(后来者)往低地址处压栈
32bit宽的数0x12345678
在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
存放内容 | 0x78 | 0x56 | 0x34 | 0x12 |
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
存放内容 | 0x12 | 0x34 | 0x56 | 0x78 |
解析:这个例子我就不解析了,希望能看懂我文章的朋友自行推断一下。
最后补上结论:
大端模式Big-endian,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中
小端模式Little-endian,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中
本文由Cout_Sev 亲自撰写。
部分资料摘自网络,若有错误欢迎指正
转载请注明出处:http://blog.csdn.net/cout_sev/
谢谢合作!
从内存中堆栈的分配格局解析大小端模式