導航:首頁 > 源碼編譯 > 編譯器小端改大端

編譯器小端改大端

發布時間:2025-09-05 03:24:57

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位開始分配。

閱讀全文

與編譯器小端改大端相關的資料

熱點內容
直流馬達如何連接5v單片機 瀏覽:259
後綴為win的文件怎麼解壓 瀏覽:800
壓縮包解壓後為什麼一張白紙 瀏覽:583
伺服器和雲盒子 瀏覽:170
python畫cad電氣圖 瀏覽:417
三菱plcfx3sa編程電纜 瀏覽:312
山西視頻加密防盜 瀏覽:837
華為mml命令查看用戶量 瀏覽:905
場論朗道pdf 瀏覽:369
如何使用qtquick編譯器 瀏覽:46
山西高配伺服器雲伺服器 瀏覽:740
為什麼編譯按f9沒反應 瀏覽:119
購物app都適合買什麼東西 瀏覽:273
savetxt函數python 瀏覽:575
編譯器小端改大端 瀏覽:639
華為安卓哪些文件夾能刪除 瀏覽:402
手機samp伺服器地址 瀏覽:205
phpformat函數 瀏覽:565
單片機由線 瀏覽:592
如何查找方舟編譯過的app 瀏覽:898