對于字節(jié)順序(endianness)的概念,這里已經(jīng)說的很清楚。
不過為了日后方便復(fù)習(xí),我再重復(fù)一下:
一個(gè)w位的整數(shù),有位表示[X(w-1), X(w-2), ..., X1, X0],其中X(w-1)是最高有效位,X0是最低有效位。如果w是8的倍數(shù),則這些位可以分組成字節(jié),其中最高有效字節(jié)包含位[X(w-1), X(w-2), ..., X(w-8)],最低有效字節(jié)包含位[X7, X6, ..., X1, X0]。
如果一種機(jī)器在存儲器中按照從最高有效字節(jié)到最低有效字節(jié)的順序存儲,這種方式就叫做小端法(little endian); 另一些機(jī)器在存儲器中則是按照從最低有效字節(jié)到最高有效字節(jié)的順序存儲,這種方式被稱為大端法(big endian)。
那么,如何通過代碼來判斷機(jī)器的字節(jié)順序呢?
網(wǎng)上搜索了一下,比較流行的方案是利用union的共用內(nèi)存的特性來實(shí)現(xiàn),有代碼如下:
union
{
int a;
int b;
}endian;
endian.a = 1;
printf(endian.b == 1 ? "little endian" : "big endian");
不過個(gè)人感覺使用union不夠直觀和簡潔,所以自己另外寫了一個(gè):
short endian = 0x00FF;
printf(*(char*)&endian ? "little endian" : "big endian");
首先單個(gè)字節(jié)不存在endian的問題,所以用一個(gè)2個(gè)字節(jié)(intel-x86-32)的short來模擬字節(jié)序列,上面代碼中endian賦值后最高有效字節(jié)的二進(jìn)制位全為0,而最低有效字節(jié)全為1。如果是在big endian的機(jī)器上,endian在內(nèi)存中應(yīng)該是這樣存放的:
00000000 11111111
而在littel endian機(jī)器上又該是這樣存放的:
11111111 00000000
如你所知,存儲器按字節(jié)編址,(char*)&endian這行代碼告訴編譯器把endian當(dāng)成字節(jié)序列來看待而不是short,這樣(char*)&endian返回的結(jié)果就會是endian的最低有效字節(jié)的地址。這樣,我們通過判斷這個(gè)地址保存的值是否非0就可以知道機(jī)器的字節(jié)順序。