大端小端


1、概念

對於一個由2個字節組成的16位整數,在內存中存儲這兩個字節有兩種方法:

一種是將低序字節存儲在起始地址,這稱為小端(little-endian)字節序;

另一種方法是將高序字節存儲在起始地址,這稱為大端(big-endian)字節序。

如123  1就是高序字節 3就是低序字節

 

2、為什么會出現大端小端兩種模式?

這是因為在計算機系統中,我們是以字節為單位的,每個地址單元都對應着一個字節,一個字節為8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於8位的處理器,例如16位或者32位的處理器,由於寄存器寬度大於一個字節,那么必然存在着一個如果將多個字節安排的問題。因此就導致了大端存儲模式和小端存儲模式。例如一個16bit的short型x,在內存中的地址為0x0010,x的值為0x1122,那么0x11為高字節,0x22為低字節。對於大端模式,就將0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,剛好相反。我們常用的X86結構是小端模式,而KEIL C51則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬件來選擇是大端模式還是小端模式。一般操作系統都是小端,而通訊協議是大端的。
  在iOS中是小端模式

 

3、大端和小端也可以翻譯為“高尾端”和“低尾端”

這就好理解了:如果把一個數看成一個字符串,比如11223344 它的尾端很顯然是44,看它是高尾端還是低尾端就看尾端放在高地址還是低地址,它在內存中的放法非常直觀,如下圖:

 

 

下面在項目中查看數據在內存中的存放情況:

如上圖所示,創建一個對象,然后給兩個成員變量賦值。

那么他的內存結構應該是前面八個字節是isa指針  后面四個字節是存放no變量值的  再接下來四個字節是存放age變量值的

no 4在內存中存儲形式應為:ox00 00 00 04

age 5在內存中存儲形式應為:ox00 00 00 05

04  05  為尾端 是低序字節  寫在了低地址位  所以為小端模式

下面內存結構如圖:(內存地址從左往右依次遞增的)

 

在讀取的時候也是,低地址位的數據讀取出來后放到低序字節 然后內存依次往后讀取,數據依次放到高序字節位

 

下面兩篇文章介紹的較為詳細:

參考資料1

參考資料2

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM