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

大端小端與字節對齊:原理、判斷代碼與結構體實戰詳解

     編輯:關於C語言

一、大端模式 vs 小端模式

定義對比

模式高位字節存放位置低位字節存放位置
Big-Endian (大端)低地址高地址
Little-Endian (小端)高地址低地址

直觀示例:16 位整數 0x1234 存儲對比(起始地址 0x4000)

地址小端內容大端內容
0x40000x340x12
0x40010x120x34

C 語言運行時判斷代碼

int i = 1;
char *p = (char *)&i;
if (*p == 1)
    printf("Little Endian");
else
    printf("Big Endian");

原理:int 佔 4 字節,值 1 在小端模式下首字節為 0x01,大端模式下首字節為 0x00。

二、字節對齊:為什麼需要、如何計算

根本原因:CPU 訪存效率

CPU 以「字」(通常 4 字節)為單位讀取內存。若 int 跨邊界存放(如地址 2~5),需兩次總線周期;對齊到 4 的倍數地址則一次讀取完成。

對齊三大原則

  1. 單獨變量:起始地址為類型大小的整數倍(int 4 的倍數,short 2 的倍數,char 任意)。
  2. 結構體成員:按最大成員類型大小對齊;結構體總大小為最大成員大小的整數倍。
  3. 位域:同類型位域盡量壓縮在同一字節/字中;跨類型或空間不足時另起新單元。

實戰演練:結構體大小計算

// 案例 1:普通成員
struct Test1 {
    char x1;    // 偏移 0
    char x4;    // 偏移 1
    short x2;   // 偏移 2 (2的倍數)
    char x5;    // 偏移 4
}; // sizeof = 6 (最大成員 short=2, 6是2的倍數)

// 案例 2:位域壓縮
struct Test2 {
    char x1:2;
    char x4:6;  // 共 1 字節
    char x2:7;
    char x5:4;  // 共 2 字節 (7+4=11>8, 換行)
}; // sizeof = 3

// 案例 3:位域溢出導致擴容
struct Test3 {
    char x1:2;
    char x4:7;  // 9 bits > 8, 佔 2 字節
    char x2:7;
    char x5:4;
}; // sizeof = 4

三、工程落地建議

  • 使用 #pragma pack(n) 或 __attribute__((packed)) 可強制修改對齊數,但可能降低訪存性能甚至觸發硬件異常(部分架構不支持非對齊訪問)。
  • 網絡協議、文件格式解析時,務必顯式處理字節序(htonl/ntohl 系列),不可假設宿主機序。
  • 結構體設計時,將大類型成員前置,可減少填充字節,節省內存。

本文轉載自 “李海川” 博客,原文地址:https://lihaichuan.blog.51cto.com/498079/1304010

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved