試題:請寫一個C函數,若處理器是Big_endian的,則返回0;若是Little_endian的,則返回1
解答:
- int checkCPU()
- {
- {
- union w
- {
- int a;
- char b;
- } c;
- c.a = 1;
- return (c.b == 1);
- }
- }
剖析:
嵌入式系統開發者應該對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模式讀寫。如果誰能當場給出這個解答,那簡直就是一個天才的程序員。