首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 利用 Union 檢測電腦位元組序(大端/小端模式)

     編輯:關於C++

位元組序決定多位元組資料在記憶體中的儲存順序,網路通訊、檔案格式、跨平台資料交換皆須處理此議題。本文示範利用 C++ union(共用體)特性,編寫可攜式程式碼偵測系統位元組序。

位元組序基本概念

  • 大端序:高位元組儲存於低位址(網路位元組序標準)。
  • 小端序:低位元組儲存於低位址(x86/x64 架構預設)。

以 32 位元整數 0x00000001 為例:

大端序:  位址遞增 →  00 00 00 01
小端序:  位址遞增 →  01 00 00 00

Union 偵測原理

union 成員共用同一塊記憶體,大小等於最大成員。宣告含 int 與 char 的 union,將 int 設為 1,檢查 char 成員(最低位址)的值:

  • 若為 1 → 低位址存低位元組 → 小端序
  • 若為 0 → 低位址存高位元組 → 大端序

完整實作程式碼

#include <iostream>
using namespace std;

void checkEndianness() {
    union {
        int i;
        char c;
    } tester;

    tester.i = 1;  // 0x00000001

    if (tester.c == 1) {
        cout << "系統採用小端序" << endl;
    } else if (tester.c == 0) {
        cout << "系統採用大端序" << endl;
    } else {
        cout << "非預期結果" << endl;
    }
}

int main() {
    checkEndianness();
    return 0;
}

進階:標準庫與網路轉換函式

實務開發建議使用標準函式進行位元組序轉換,確保跨平台相容:

  • htonl() / ntohl():32 位元主機/網路序轉換
  • htons() / ntohs():16 位元轉換
  • C++20 std::endian 編譯期偵測:std::endian::native == std::endian::little

注意事項

  • Union 存取非最後寫入成員屬於「實作定義行為」,但主流編譯器(GCC、Clang、MSVC)皆支援此用法。
  • 嚴格遵循 C++ 標準者,可改用 memcpy 或 reinterpret_cast 搭配 char* 檢查位元組。
  • 網路傳輸務必統一轉為網路位元組序(大端序),避免異構系統溝通錯誤。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved