在計算機系統當中,數據的存儲是以字節為單位的,每個地址單元當中都可以存放一個字節的數據,每個字節為8bit。在C語言中編譯器為char型的數據分配了一個字節的存儲空間,為long型的數據分配了4個字節的存儲空間,為int型的數據分配了2個字節的存儲空間(要看具體的編譯器),這樣當所定義的數據類型占用的存儲空間大于一個字節時就需要用多個字節的空間來存儲一個數據,即一個數據占用了多了地址單元,這樣就存在著一個存儲順序的問題,即這幾個字節在內存單元中是以什么樣的順序來存儲的。
在ARM體系中通常采用的字節存儲機制主要有兩種:Big-Endian(大端模式)Little-Endian(小端模式)。Big-Endian是指數據的高字節保存在內存的低地址中,而數據的低字節保存在內存的高地址中。Little-Endian是指數據的高字節保存在內存的高地址中,而數據的低字節保存在內存的低地址中,這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低,和我們的邏輯方法一致。
舉一個例子,比如十六進制數字0x12345678在內存中的表示形式為:
1)大端模式:
低地址 -----------------> 高地址
0x12 | 0x34 | 0x56 | 0x78
2)小端模式:
低地址 ------------------> 高地址
0x78 | 0x56 | 0x34 | 0x12
在ARM體系結構中采用Big-Endian存儲模式還是Little-Endian存儲模式都各有利弊,比如在Little-Endian模式下強制轉換數據不需要調整字節內容,而在Big-Endian模式下符號位的判定固定為第一個字節,與Little-Endian模式相比較更容易判斷數據的正負。
在ARM體系中默認的存儲格式為小端對齊,但ARM處理器還可以由硬件來選擇是大端模式還是小端模式。