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

C語言中 int 與 long 的區別:位寬、標準規範與實戰避坑指南

     編輯:C 語言問答

標準規範的核心承諾

C 標準(C99/C11/C17)對整數型別僅做最小位寬與相對大小保證:

  • int:至少 16 位,通常代表目標架構的「自然字長」(最高效的整數運算單元)。
  • long:至少 32 位,且 sizeof(long) >= sizeof(int)。
  • long long (C99+):至少 64 位。

標準不保証具體位寬,僅保證範圍:`INT_MIN` ~ `INT_MAX`、`LONG_MIN` ~ `LONG_MAX`(定義於 ``)。

主流平台上的實際位寬(資料模型)

平台 / ABIintlong指標資料模型
16-bit 實模式 (DOS, 8086)163216/32IP16
32-bit x86 (Linux/Windows)323232ILP32
64-bit Linux/macOS/BSD (System V AMD64 ABI)326464LP64
64-bit Windows (Microsoft x64 ABI)323264LLP64
嵌入式 32-bit ARM (ARM EABI)323232ILP32
嵌入式 64-bit ARM (AArch64)326464LP64

關鍵差異點總結

  1. 位寬不固定:`int` 通常 32 位,`long` 可能 32 或 64 位(Windows 64 位下為 32 位,Linux 64 位下為 64 位)。
  2. 可移植性陷阱:假設 `long` 是 64 位或 `int` 是 32 位的代碼在跨平台時極易出錯。
  3. 格式化字串不同:`int` 用 `%d`/`%u`,`long` 用 `%ld`/`%lu`,`long long` 用 `%lld`/`%llu`(或 C99 的 `%zd` 對應 `size_t`/`ptrdiff_t`)。
  4. 效能考量:在 64 位 LP64 系統上,64 位 `long` 運算可能比 32 位 `int` 慢(取決於指令集),且佔用更多記憶體/快取。

現代 C 開發最佳實踐:使用精確寬度型別

自 C99 起,`` 提供精確寬度、最小寬度、最快型別,應優先使用:

#include 

int32_t  i32;   // 精確 32 位有號整數
uint64_t u64;   // 精確 64 位無號整數
int_least32_t  at_least_32;  // 至少 32 位
int_fast16_t   fast_16;      // 至少 16 位且運算最快
intptr_t       ptr_sized;    // 能容納指標的有號整數
uintptr_t      uptr_sized;   // 能容納指標的無號整數
size_t         sz;           // 物件大小(無號)
ptrdiff_t      diff;         // 指標差值(有號)

避坑檢查清單

  • ❌ 不要寫 `long ptr = (long)p;` → ✅ 用 `uintptr_t` / `intptr_t`。
  • ❌ 不要假設 `sizeof(long) == sizeof(void*)` → ✅ 用 `uintptr_t`。
  • ❌ 不要用 `%ld` 打印 `int32_t` → ✅ 用 `PRId32` / `PRIu64` 等 `` 宏。
  • ❌ 不要用 `long` 存儲檔案大小/位移 → ✅ 用 `off_t` (POSIX) 或 `int64_t`/`uint64_t`。
  • ✅ 跨平台網路協議/檔案格式/序列化必須使用固定寬度型別(`uint32_t` 等)並處理位序。

總結

`int` 是「機器字長」,`long` 歷史上是「擴展整數」,現代 64 位系統分裂為 LP64 (Unix) 與 LLP64 (Windows)。編寫可移植、健壯、高效的 C 代碼,請拋棄對 `int`/`long` 具體位寬的假設,全面擁抱 `` 與 ``。

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