字節序由處理器決定,它分為兩大陣營,一方以Intel為代表,其處理器的字節序是小尾端模式,即低地址存儲數據的低位部分,高地址存儲數據的高位部分;另一方以IBM為代表,其處理器的字節序是大尾端模式,即低地址存儲數據的高位部分,高地址存儲數據的低位部分。可用以下的簡單代碼測試CPU的大小端,小段輸出0x78,大端0x12
#include <stdio.h> int main() { int i = 0x12345678; char *p = &i; printf("%x\n", p); return 0; }
結構體的位域成員變量
為了節省空間,如果結構體有幾個成員變量的取值范圍很小,那麼可以考慮將它們合並在一個字節裡或一個short、int變量裡。使用一個類型超過一個字節的變量時,需要考慮字節序,那麼在結構體中使用位域時,需不需要考慮bit序呢?即一個整形變量內包含多個位域變量,各變量的bit順序是不是固定的呢?通過測試發現,各CPU體系結構的位域bit序跟其字節序大小端是一致的。
TCP/IP協議規定,網絡數據流應采用大端字節序,即低地址高字節。如果主機是小端字節序,發送和接受都需要做轉換。同理,32位的IP地址也要考慮網絡字節序和主機字節序的問題。
可用以下庫函數做網絡字節序和主機字節序的轉換,使網絡程序可移植:
#include <arpa/inet.h> uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort);