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

C 整數截斷行為與大小端模式判斷實作

     編輯:關於C

int 賦值給 char 的截斷規則與 CPU 位元組序檢測

當 16/32 位元整數賦值給 8 位元 char 時,C 標準規定保留**低位元組**(Least Significant Byte),高位元組直接捨棄。本文以實測驗證此行為,並展示利用 union 檢測 CPU 大小端模式的經典技巧,兩者邏輯互為驗證。

整數截斷實測

int val = 4874;          // 0x0000130A
char c = val;            // 保留低位元組 0x0A → 'A' (ASCII 10)
printf("%x\n", c);       // 輸出 a (十六進位 0A)

GCC 輸出 a,證實保留低位元組(Little-endian 行為一致)。

大小端模式檢測原理

利用 union 讓 int 與 char 共用同一記憶體起始位址:

union { int i; char c; } u;
u.i = 0x12345678;
if (u.c == 0x78) puts("Little-endian");  // 低位元組在低地址
else if (u.c == 0x12) puts("Big-endian"); // 高位元組在低地址

記憶體佈局對照

位址Little-endianBig-endian
0x80000x780x12
0x80010x560x34
0x80020x340x56
0x80030x120x78

完整檢測程式

#include <stdio.h>
#include <stdlib.h>

int is_little_endian() {
    union { int i; char c; } u = { .i = 0x12345678 };
    return u.c == 0x78;
}

int main() {
    int val = 4874;
    char c = val;
    printf("int 0x%x → char 0x%x (%s)\n", val, c & 0xFF,
           is_little_endian() ? "Little-endian" : "Big-endian");
    return 0;
}

應用場景

  • 網路程式:主機序轉網路序 (htonl/ntohl)。
  • 二進位檔案格式解析:BMP、ELF、TCP/IP 標頭。
  • 嵌入式裝置驅動:與大端 MCU 通訊時的位元組序轉換。

理解「整數截斷保留低位元組」與「大小端決定低位元組在低/高地址」兩個獨立但相關的概念,是系統程式開發者的必修內功。

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