請寫一個C函數,若處理器是Big_endian的,則返回0;若是Little_endian的,則返回1
大家都知道,采用Little-endian模式的CPU對操作數的存放方式是從低字節到高字節,而Big-endian模式對操作數的存放方式是從高字節到低字節。
例如,16bit寬的數0x1234在Little- endian模式CPU內存中的存放方式(假設從地址0x4000開始存放)為:
內存地址 存放內容
0×4000 0×34
0x4001 0×12
而在Big-endian模式CPU內存中的存放方式則為:
內存地址 存放內容
0×4000 0×12
0×4001 0×34
32bit寬的數0x12345678在Little-endian模式CPU內存中的存放方式(假設從地址0x4000開始存放)為:
內存地址 存放內容
0×4000 0×78
0×4001 0×56
0×4002 0×34
0×4003 0×12
而在Big-endian模式CPU內存中的存放方式則為:
內存地址 存放內容
0×4000 0×12
0×4001 0×34
0×4002 0×56
0×4003 0×78
源碼就可以寫成這樣:
int checkCPU()
{
{
union u
{
int a;
char b;
} c;
c.a = 1;
return (c.b == 1);
}
}
www.2cto.com
聯合體union的存放順序是所有成員都從低地址開始存放,利用該特性,就能輕松地獲得了CPU對內存采用Little-endian還是Big-endian模式讀寫。
這比任何判斷語句都要輕松,快捷!
請關注 李木空間 www.limou.net