2014-10-05 136 views
0

我必須爲2個表示之間的轉換寫一個例程。 但我有點困惑。 如果我有與32個比特 ,我必須字0xA15D23B1 存儲與大端字的存儲器的體系結構23之後,並在端B1 與小端成爲A1 5D之後的存儲器,而該存儲器是B1 23日後5D後A1 是不是?Little-endian和Big-endian

如果我可以解決我機器上的單個字節和我的單詞的地址爲零 誰是字節1? 在Big-endian中是5D?在小端也是5D?

謝謝大家誰都會回答我

+0

不,這是不對的,你已經倒退了。在小端中,最低有效字節具有最低地址。 – 2014-10-05 15:54:07

+0

你的第一段是正確的,除了不正確地使用「after」這個詞使它有點混亂(我認爲你的意思是「後面」而不是「之後」)。我不明白你在第二段中提出的問題。 – interjay 2014-10-05 15:55:58

+0

你已經回答了你的問題。 「5天后和23天后B1」。你能描述一下你的實際編程問題嗎?地址零通常不可用於程序。你可以使用像hton這樣的函數來避免完全處理endian問題。 – 2014-10-05 15:56:43

回答

5

大端內存佈局是最顯著第一字節,而little-endian的佈局是第一至少顯著字節。給定的值0xA15D23B1:

Memory address 0 1 2 3 
Big-endian  A1 5D 23 B1 
Little-endian B1 23 5D A1 

注意大端內存佈局不相對於字大小改變,但小端一樣。如果考慮兩個簡單的字(16位),0xA15D和0x23B1連續存儲:

Memory address 0 1 2 3 
Big-endian  A1 5D 23 B1 
Little-endian 5D A1 B1 23 
0
  • 和little-endian的是5D嗎?

號在小尾數是23

0

記「這是」一個好辦法:

大端從大(最顯著)結束時開始;小端從小端開始。

例如,對於單詞0xA15D23B1作爲一個字節序列時,大端機器從最顯著字節0xA1啓動它。它將被存儲在最低地址(這是潛在的混淆詞「開始」的含義)。順便說一句,如果你只想從big-endian轉換成little-endian或back,你不必理解這一點:只需要顛倒字節順序!這就是爲什麼很多人不理解what "big-endian" or "little-endian" means - 你通常只需要瞭解是否要交換字節。

0

處理器有多種方式實現big-endian和little-endian - 有關詳細的討論,請參閱有關Endianness的Wikipedia文章。

對於2字節數量,僅存在兩個選項:

Value:   0x1234 (MSB = 0x12, LSB = 0x34) 
Little-endian: LSB then MSB 0x34 0x12 — Intel, … 
Big-endian:  MSB then LSB 0x12 0x34 — SPARC, PowerPC, … 

對於4字節數量,有更多的選項,但仍有兩個伯酮(加上一個歷史好奇心):

Value:   0x12345678 (MSB = 0x12, NMSB = 0x34, NLSB = 0x56, LSB = 0x78) 
Little-endian: LSB, NLSB, NMSB, MSB 0x78 0x56 0x34 0x12 
Big-endian:  MSB, NMSB, NLSB, LSB 0x12 0x34 0x56 0x78 
PDP-11:   NMSB, MSB, NLSB, LSB 0x34 0x12 0x78 0x56 

注意,許多現代化的芯片組是雙端 - 可以切換到大端或小端模式下運行:

某些體系結構(包括ARM版本3及以上版本,PowerPC,Alpha,SPARC V9,MIPS,PA-RISC,SuperH SH-4和IA-64)具有允許在數據段,代碼段或二者中可切換字節序的設置。

相關問題