堆栈、内存的增长方向与大小端

在学习网络编程socket的时候碰到主机内部字节存储顺序大小端的问题,一直很困扰,今天终于搞清楚了,于是将其记录下来,以便后面复习。

大小端问题:

小端:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。如Intel  x86结构就是使用小端模式。

大端:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。如IBM  power PC结构就是使用的大端模式。

如何理解:首先要知道不管是大端还是小端,cpu在读取和存储数据的时候一定都是从内存的低地址依次向高地址读取或写入。

0x300000010x300000020x300000030x300000040x30000005
0x120x340x560x780x99

假设A(大端模式)存储如上图的数据,他要将该数据发送给B(小端模式),该数据在A中表示为多少?那么B接收的数据是多少?该数据在内存中的分布是什么样的?

该数据在A中表示为1234567899,因为数据的高字节保存在内存的低地址中。

根据cpu在读写数据的时候一定都是从内存的低地址依次向高地址读写的原则,0x12先读取并发送给B,存储到B的低地址处,然后是0x34、...0x99。发送完毕后,该数据在B中的内存分布和A中一样,没错,一样。

0x300000010x300000020x300000030x300000040x30000005
0x120x340x560x780x99

该数据在A中表示为9987654321,因为数据的高字节保存在内存的高地址中。

ok,到这里大小端问题搞清楚了。

堆栈和内存增长方向问题:

堆:生长方向是向上的,也就是向着内存地址增加的方向。通常我们在画内存四区图时,堆的开口是向上的。

栈:它的生长方式是向下的,是向着内存地址减小的方向增长。栈的开口是向下的,上面的底部是栈底,下面的开口是栈顶。

在内存中,“堆”和“栈”共用全部的自由空间,只不过各自的起始地址和增长方向不同,它们之间并没有一个固定的界限,如果在运行时,“堆”和 “栈”增长到发生了相互覆盖时,称为“栈堆冲突”,系统崩溃。

理解:

参考:https://www.cnblogs.com/xkfz007/archive/2012/06/22/2558935.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值