導語:
在計算機中間,不同的操作系統支持的字節序不同,簡單來說:比如一個十六進制的數在內存中是怎樣存儲的 列:0x0102 在計算機中存儲時 是 01 在低字節還是02 在低字節。我們可以通過如下程序實現
#include <stdio.h>
int main(int argc , char ** agrv)
{
union{
short s;
char c[sizeof(s)];
}un;
un.s = 0x0102;
if(sizeof(short) == 2)
{
if(un.c[0] == 1 && un.c[1] == 2)
printf("big-endian\n");
else if(un.c[0] ==2 && un.c[1] == 1)
printf("little-endian\n");
else
printf("unknow\n");
}
else
printf("sizeof(short) = %d\n", sizeof(short));
return 0;
}
中間的 union 是 C語言中的公用體,與 struct 體不同的是 結構體 中的每個值都有屬於自己的存儲區域,不會重合,而 union中的每個值公用一處存儲區域,所以當我 在 使用 un.s = 0x0102 後 公用體就已經存儲了0x0102, 當我使用 un.c[0],和 un.c[1] 時 由於訪問的是與 un.s相同的內存區域,故取出來的值就是 我使用 un.s 存進去的值, 從而通過比較 un.c[0] 和 un.c[1] 的值 就可以知道0x0102 在內存中的存儲順序。
最後可能有些 庫裏面的 short 的位數不爲16位,所以可能得不到我們想要的結構
需要更加深入的 請看 《unix 網絡編程 套接口》