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

C語言基本數據類型取值範圍與溢出行為詳解

     編輯:關於C語言

C語言基本數據類型取值範圍與溢出行為詳解

熟悉數據類型的大小、範圍與溢出規則,是編寫無 Bug C 代碼的基礎。本文匯總常見平台(32/64 位)下的類型大小與範圍,並通過實例分析有符號/無符號溢出的位級行為。

類型大小速查(典型 32/64 位 Linux/Windows)

類型字節數備註
char1有符號性實現定義
short2
int416位系統為2
long4/8Windows 64位為4,Linux 64位為8
long long8C99 標準
float4IEEE 754 單精度
double8IEEE 754 雙精度
pointer4/8隨架構

最佳實踐:永遠用 sizeof(T) 獲取當前平台大小,不要硬編碼。

取值範圍(二進制補碼表示)

類型最小值最大值
signed char-128127
unsigned char0255
signed short-32,76832,767
unsigned short065,535
signed int (32位)-2,147,483,6482,147,483,647
unsigned int (32位)04,294,967,295
signed long (64位)-9.22e189.22e18
float~ -3.4e38~ 3.4e38
double~ -1.7e308~ 1.7e308

溢出行為深度分析

1. 有符號整數溢出 → 未定義行為 (UB)

signed char c = 127;
c += 1;  // UB!實際上大多數平台回繞為 -128
// 位級過程:01111111 + 1 = 10000000 (補碼表示 -128)

標準規定:有符號溢出屬 UB,編譯器可假設不發生並進行激進優化,**不可依賴回繞行為**。

2. 無符號整數溢出 → 定義為模 2^N 回繞

unsigned char c = 255;
c += 1;  // 保證結果為 0
// 位級:11111111 + 1 = 1 00000000 → 截取低 8 位 = 00000000

3. 實戰陷阱:常量表達式溢出

// 錯誤:int 溢出(假設 16 位 int)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)  // 31,536,000 > 32,767

// 正確:強制長整型運算
#define SECONDS_PER_YEAR (60L * 60 * 24 * 365)  // 至少長整型
// 或 C99:  (60 * 60 * 24 * 365LL)

口訣:常量表達式中**至少一個操作數加 L/LL/UL/ULL**,迫使整個表達式以長整型計算。

宏定義與常量最佳實踐

  • 宏名、枚舉、只讀變量**全大寫 + 下劃線**:#define MAX_BUFFER_SIZE 1024;
  • #define **不以分號結尾**,參數宏括號包裹:#define SQUARE(x) ((x)*(x));
  • 優先使用 const / enum / constexpr (C++) 替代宏,擁有類型安全與作用域;
  • 避免宏副作用:SQUARE(i++) 會展開為 ((i++)*(i++)) 導致雙重自增。

快速驗證技巧

// 編譯期斷言 (C11)
_Static_assert(sizeof(int) == 4, "int must be 4 bytes");
_Static_assert(INT_MAX == 2147483647, "unexpected int range");

掌握類型範圍與溢出規則,能在編碼階段就消滅一大類隱蔽 Bug,也是面試、考研高頻考點。

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