A. 大端模式和小端模式
具體如下:
1、大端模式:
大端模式,是指數據的高位,保存在內存的低地址中,而數據的低位,保存在內存的高地址中,這樣的存儲模式類似於把數據當作字元串順序處理。
地址由小向大增加,而數據從高位往低位放;小端模式,是指數據的高位保存在內存的高地址中,而數據的低位保存在內存的低地址中,這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低,和我們的邏輯方法一致。
在大端模式下,前16位應該這樣讀: e6 84 6c 4e ( 假設int佔4個位元組)。
記憶方法: 地址的增長順序與值的增長順序相反。
2、小端模式例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000。
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000。
在小端模式下,前16位應該這樣讀: 4e 6c 84 e6( 假設int佔4個位元組)。
記憶方法: 地址的增長順序與值的增長順序相同。
大小端模式:
為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個地址單元都對應著一個位元組,一個位元組為 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處理器還可以由硬體來選擇是大端模式還是小端模式。
B. 大小端轉換的原因
這是因為在計算機系統中,我們是以位元組為單位的,每個地址單元都對應著一個位元組,一個位元組為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處理器還可以由硬體來選擇是大端模式還是小端模式。
• Little-Endian:低位位元組排放在內存的低地址端,高位位元組排放在內存的高地址端。示例數字0x12 34 56 78在內存中的表示形式:
內存 低地址 -----------------> 高地址
0x78 | 0x56 | 0x34 | 0x12 *
低位子節 -----------------> 高位子節*
• Big-Endian:高位位元組排放在內存的低地址端,低位位元組排放在內存的高地址端。示例數字0x12 34 56 78在內存中的表示形式:
內存 低地址 -----------------> 高地址
0x12 | 0x34 | 0x56 | 0x78
高位子節 -----------------> 低位子節
注釋:
對於大小端的幾個結論:
1.char型變數和char型數組沒有大小端的區分。
2.需要轉化數據類型大於1個位元組的數據類型:short,int,枚舉,聯合體等。
簡單說一下為什麼要進行大小端轉化:目前我接觸到的,arm是小端,dsp是大端,電腦是小段,網路數據一般為大端,當arm需要和dsp通信的時候就會存在大小端轉化的問題,每種晶元為什麼選用大小端的由來就不贅述了。
1,舉例說明位元組間的大小端:
內存中有如下一段數據(unsigned int 型),不同的大小端對這個段數據的理解不同,所以在我們實際工作中,當你查看到內存中的數據時候,首先要清楚這個處理器的大小端,才能理解這段數實際代表的值。
如果是大端處理器:這段數代表:0x12345678;
如果是小段處理器:這段數代表:0x78563412 ;
內存中有如下一段數據(unsigned short 型):
如果是大端處理器:這段數代表的值:0x1234;
如果是小段處理器:這段數代表的值:0x3412 ;
在兩個不同大小端的處理器之間數據傳輸,數據再內存的存放順序並沒有變,不同大小端需要解讀出通用的值,就需要進行大小端轉化。
小端數據為:0x E4BDB9D7, 現將數據進行翻轉看,然後從底地址數據開始讀:
可以看出小端是從底地址的位元組的底bit位開始分配。