Linux C快速指南--如何獲知系統平臺的位元組序
阿新 • • 發佈:2018-12-16
位元組序簡單的說,指的就是資料在機器上儲存的排序方式,一般分為兩種:大位元組序(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!