Big Endian與Little Endian的判別

 
    以前看書時遇到過這個問題,當時用了一個星期,想破腦袋都沒能搞定。現在看了答案後,才感覺自己真“笨”。得,今天把它記下來,以後再碰到這樣的問題就不頭疼了。
 

試題:請寫一個C函數,若處理器是Big_endian的,則返回0;若是Little_endian的,則返回1

  解答:


  1. int checkCPU()
  2. {
  3.  {
  4.   union w
  5.   {
  6.    int a;
  7.    char b;
  8.   } c;
  9.   c.a = 1;
  10.   return (c.b == 1);
  11.  }
  12. }

  剖析:

  嵌入式系統開發者應該對Little-endian和Big-endian模式非常瞭解。採用Little-endian模式的CPU對操作數的存放方式是從低字節到高字節,而Big-endian模式對操作數的存放方式是從高字節到低字節。例如,16bit寬的數0x1234在Little-endian模式CPU內存中的存放方式(假設從地址0x4000開始存放)爲:

內存地址

存放內容

0x4000

0x34

0x4001

0x12


  而在Big-endian模式CPU內存中的存放方式則爲:

內存地址

存放內容

0x4000

0x12

0x4001

0x34


  32bit寬的數0x12345678在Little-endian模式CPU內存中的存放方式(假設從地址0x4000開始存放)爲:

內存地址

存放內容

0x4000

0x78

0x4001

0x56

0x4002

0x34

0x4003

0x12


  而在Big-endian模式CPU內存中的存放方式則爲:

內存地址

存放內容

0x4000

0x12

0x4001

0x34

0x4002

0x56

0x4003

0x78


  聯合體union的存放順序是所有成員都從低地址開始存放,面試者的解答利用該特性,輕鬆地獲得了CPU對內存採用Little-endian還是Big-endian模式讀寫。如果誰能當場給出這個解答,那簡直就是一個天才的程序員。
 
後記:第一次碰到這個問題是在看《深入理解計算機系統》這本書的第二章的時候,當時要求的函數名稱是IsLittleEndian。希望對這個問題正在頭疼的朋友看了答案後就不頭疼了。:P
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章