大段模式和小端模式的判斷

2021-09-01 14:15:28 字數 1329 閱讀 7932

試題1:請寫乙個c函式,若處理器是big_endian的,則返回0;若是little_endian的,則返回1 int checkcpu( ) c;

c.a = 1;

return (c.b ==1); }}

剖析: 嵌入式系統開發者應該對little-endian和big-endian模式非常了解。採用little-endian模式的cpu對運算元的存放方式是從低位元組到高位元組, big-endian 模式的cpu對運算元的存放方式是從高位元組到低位元組。 在弄清楚這個之前要弄清楚這個問題: 位元組從右到坐為從高到低! 假設從位址0x4000開始存放: 0x12345678,是也個32位四個位元組的資料,最高位元組是0x12,最低位元組是0x78: 在little-endian模式cpu記憶體中的存放方式為: (高位元組在高位址, 低位元組在低位址)

記憶體位址0x4000 0x4001 0x4002 0x4003

存放內容 0x78 0x56 0x34 0x12

大端機則相反。

有的處理器系統採用了小端方式進行資料存放,如intel的奔騰。有的處理器系統採用了大端方式進行資料存放,如ibm半導體和freescale的powerpc處理器。不僅對於處理器,一些外設的設計中也存在著使用大端或者小端進行資料存放的選擇。 因此在乙個處理器系統中,有可能存在大端和小端模式同時存在的現象。這一現象為系統的軟硬體設計帶來了不小的麻煩,這要求系統設計工程師,必須深入理解大端和小端模式的差別。大端與小端模式的差別體現在乙個處理器的暫存器,指令集,系統匯流排等各個層次中。 聯合體union的存放順序是所有成員都從低位址開始存放的。 以上是網上的原文。讓我們看看在arm處理器上union是如何儲存的呢? 位址a ---------------- |a |a+1 |a+2 |a+3 |int a; | | | | -------------------- |a |char b; | | --------- 如果是小端如何儲存c.a的呢?

位址a -----------

------------------- |a |a+1 |a+2 |a+3 | int a;

|0x01 |0x00 |0x00 |0x00 | ------------------------------------- |a |char b; | | ---------

如果是大端如何儲存c.a的呢?

位址a ---------------------

--------- |a |a+1 |a+2 |a+3 |int a; |0x00 |0x00 |0x00 |0x01 | ------------------------------------------ |a |char b; | | --------- 現在知道為什麼c.b==0的話是大端,c.b==1的話就是小端了吧。

小端模式和大端模式 大端模式和小端模式

0x123456在記憶體中的儲存方式 大端模式 低位址 小端模式 低位址 不難看出大端模式比較符合人的直觀認識 1.一開始是由於不同架構的cpu處理多個位元組資料的順序不一樣,比如x86的是小段模式,keil c51是大端模式。但是後來網際網路流行,tcp ip協議規定為大端模式,為了跨平台通訊,還...

判斷大端小端模式

試題1 請寫乙個 c函式,若處理器是 big endian 的,則返回 0 若是 little endian 的,則返回1 解答 int checkcpu c c.a 1 return c.b 1 剖析 嵌入式系統開發者應該對 little endian 和big endian 模式非常了解。採用 ...

大端模式與小端模式判斷

在大端模式下,資料的msb存放在低位址 在小端模式下,資料的lsb 存放在低位址。一 大端與小端 msb與lsb 在嵌入式開發中,大端 big endian 和小端 little endian 是乙個很重要的概念。假如現有一32位int型數0x12345678,那麼其msb most signifi...