對於大端、小端的區別,可能看資料的時候確實理解了,但過段時間就搞混了;高位低位址、低位高位址、高位高位址、低位低位址...是不是看起來就好頭大,哪個對應哪個啊。其實可以把大小端與堆疊聯絡起來記憶,雖然兩者講的不是乙個粒度的,但大小端模式裡高低位的存放與堆和棧的生長方向有乙個共同點,它們都存在乙個資料存放順序的問題。
下面結合幾張圖說明一下。
假設機器為32位的,為方便表示,下文的資料都以16進製制來表示。有乙個數為0x12345678,在大端、小端模式下分別以下面兩張圖的形式儲存:
可以看出,大端是高位儲存在低位址,低位儲存在高位址,而小端正相反,高位儲存在高位址,低位儲存在低位址。仔細觀察一下,其實大端更符合人類的書寫方式;人手動在紙上寫出來0x12345678,一般都是從左到右,先寫1,再寫2,依次類推,最後寫8,大端也是這樣,從初始的儲存位置,先存入12,再存入34,最後存入78;對人類來說,小端就有點繞了,要畫出其儲存結構,先要計算下總共佔幾個位元組,然後從初始位址往上數幾個位元組,再由上到下分別寫12、34、56、78。對上面的兩個圖分別加個箭頭可以更清楚的說明人一般的思維過程,見下面兩圖:
即棧是由上往下生長的,堆相反,由下往上生長。這個一般很好記,兩個對著生長,可以提高記憶體的利用率。
雖然堆和棧與大端小端不是一回事情,但可以把大端小端與堆疊聯絡起來記憶,大端對應堆,由下往上生長;小端對應棧,由上往下生長。下次再遇到大小端時,是不是可以很快分清哪個是哪個了?
堆疊的生長方向
堆疊的生長方向從最本質的理解是堆疊入棧方向是從高位址向位址還是低位址向高位址。從高位址向低位址生長一般叫做向下生長,也叫作逆向生長。從低位址向高位址生長一般叫做向上生長,也叫作正向生長。一般來說堆疊是逆向生長的。51微控制器的堆疊生長方向為正向生長,因為執行push指令時先將sp的值加1再將指定的8...
關於堆疊生長方向的疑問?
os stk growth巨集的目的就是用來標示當前堆疊是向上還是向下生長的,這個巨集理解沒問題 但是當對應上ptos pbos時,我就疑惑了,倆個引數分別對應的是棧頂和棧底指標,當棧初始化為空的時候,這倆個位址應該相等,而在ucos裡面初始化idle任務時,當os stk growth 1時 堆疊...
棧增長方向與大端 小端問題
棧增長和大端 小端問題是和cpu相關的兩個問題。在記憶體管理中,與棧對應是堆。對於堆來講,生長方向是向上的,也就是向著記憶體位址增加的方向 對於棧來講,它的生長方式是向下的,是向著記憶體位址減小的方向增長。在記憶體中,堆 和 棧 共用全部的自由空間,只不過各自的起始位址和增長方向不同,它們之間並沒有...