在學習網絡編程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