在学习网络编程socket的时候碰到主机内部字节存储顺序大小端的问题,一直很困扰,今天终于搞清楚了,于是将其记录下来,以便后面复习。
大小端问题:
小端:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。如Intel x86结构就是使用小端模式。
大端:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。如IBM power PC结构就是使用的大端模式。
如何理解:首先要知道不管是大端还是小端,cpu在读取和存储数据的时候一定都是从内存的低地址依次向高地址读取或写入。
0x30000001 | 0x30000002 | 0x30000003 | 0x30000004 | 0x30000005 |
0x12 | 0x34 | 0x56 | 0x78 | 0x99 |
假设A(大端模式)存储如上图的数据,他要将该数据发送给B(小端模式),该数据在A中表示为多少?那么B接收的数据是多少?该数据在内存中的分布是什么样的?
该数据在A中表示为1234567899,因为数据的高字节保存在内存的低地址中。
根据cpu在读写数据的时候一定都是从内存的低地址依次向高地址读写的原则,0x12先读取并发送给B,存储到B的低地址处,然后是0x34、...0x99。发送完毕后,该数据在B中的内存分布和A中一样,没错,一样。
0x30000001 | 0x30000002 | 0x30000003 | 0x30000004 | 0x30000005 |
0x12 | 0x34 | 0x56 | 0x78 | 0x99 |
该数据在A中表示为9987654321,因为数据的高字节保存在内存的高地址中。
ok,到这里大小端问题搞清楚了。
堆栈和内存增长方向问题:
堆:生长方向是向上的,也就是向着内存地址增加的方向。通常我们在画内存四区图时,堆的开口是向上的。
栈:它的生长方式是向下的,是向着内存地址减小的方向增长。栈的开口是向下的,上面的底部是栈底,下面的开口是栈顶。
在内存中,“堆”和“栈”共用全部的自由空间,只不过各自的起始地址和增长方向不同,它们之间并没有一个固定的界限,如果在运行时,“堆”和 “栈”增长到发生了相互覆盖时,称为“栈堆冲突”,系统崩溃。
理解:
参考:https://www.cnblogs.com/xkfz007/archive/2012/06/22/2558935.html