1. 程式人生 > >Linux C快速指南--如何獲知系統平臺的位元組序

Linux C快速指南--如何獲知系統平臺的位元組序

位元組序簡單的說,指的就是資料在機器上儲存的排序方式,一般分為兩種:大位元組序(big endian)和小位元組序(little endian)。

舉個例子:一個2 bytes的數字0x0201存放在我們的系統中,按照數學的理解這個數字的低位元組0x01,高位元組是0x02,但是如果把這個數字儲存到我們的機器上,就會分為兩種情況。如果在小位元組序的機器上儲存,那麼低地址處存放的就是0x01,高地址處存放的就是0x02;如果在大位元組序的機器上儲存,那麼低地址處存放的就是0x02,高地址處存放的就是0x01。

小位元組序(Little Endian)
DATA:0x0201
總結:低地址存放低位資料

address data
0x1 0x01
0x2 0x02

大位元組序(Big Endian)
DATA:0x0201
總結:低地址存放高位資料

address data
0x1 0x02
0x2 0x01

到這裡我們已經知道大小位元組序的含義了,位元組序的支援跟CPU的設計有關,不同架構的CPU可能具有不同的位元組序,比如常見的intel晶片,大多是小位元組序,而PowerPC架構多是大位元組序的晶片。而對於程式開發人員來說,要開發健壯的程式必須要能相容這兩種位元組序,這就涉及到通過程式碼獲取系統支援的位元組序。
根據前面的介紹,我們可以寫一個簡單的demo:

 #include<stdio.h>
 
 typedef union {
     unsigned int num;
     unsigned char buf[2];
 } un;
 
 int main()
 {
     un data;
     data.num = 0x0201;
     if (data.buf[0] == 0x01 && data.buf[1] == 0x02)
         printf("This is Little-Endian system!\n");
     else if (data.buf[0] == 0x02 && data.buf[1] == 0x01)
         printf("This is Big-Endian system!\n");
     else
         printf("Unknown system!\n");
     return 0;
 }

在我的機器上的執行結果如下:

[email protected]:~/work/test/linuxc$ ./endian 
This is Little-Endian system!