C 標準規定:無後綴的整數常量默認類型為最小能容納其值的有符號類型(int → long → long long);浮點常量默認類型為 double。後綴用於顯式指定常量類型,避免隱式轉換、精度損失或溢出。
| 後綴 | 含義 | 示例 | 備註 |
|---|---|---|---|
U/u | 無符號 | 100U | 大小寫不敏感 |
L/l | 長整型 | 100L | 建議大寫 L 避免與數字 1 混淆 |
LL/ll | 長長整型 | 100LL | C99 引入 |
| 組合 | 無符號長/長長 | 100UL 100ULL | 順序任意 LU/UL 均可 |
| 後綴 | 類型 | 示例 |
|---|---|---|
F/f | float | 3.14f |
L/l | long double | 3.14L |
| 無 | double (默認) | 3.14 |
float f = 3.14; // 3.14 是 double,賦值時發生 double→float 隱式縮窄轉換
float f = 3.14f; // 3.14f 是 float,無轉換,精度完全匹配
核心原因:字面量類型在編譯期確定,賦值給變量時才發生轉換。使用匹配後綴可:
-Wconversion)。#define 宏中更關鍵:#define PI 3.14f 使宏展開後類型固定為 float。| 前綴 | 類型 | 示例 |
|---|---|---|
| 無 | char (窄字符) | 'a' "abc" |
L | wchar_t (寬字符) | L'A' L"ABC" |
u | char16_t (UTF-16) | u'A' u"ABC" (C11) |
U | char32_t (UTF-32) | U'A' U"ABC" (C11) |
u8 | char (UTF-8) | u8"ABC" (C11) |
0 開頭,如 0177777。0x 或 0X 開頭,如 0xFFFF、0Xffff(大小寫不敏感)。0b/0B,如 0b1010。無符號/長整型後綴同樣適用:0xFFFFUL。
無後綴時,從 int、unsigned int、long、unsigned long、long long、unsigned long long 中選擇第一個能容納該值的類型。這可能導致有符號/無符號在邊界值時類型不同,影響運算結果(如位運算、比較)。
f:float x = 1.5f;LL:long long x = 1234567890123LL;flags & 0xFFU 避免符號擴展問題。#define MAX_SIZE 1024UL。010 是八進制 8,非十進制 10。現代代碼盡量不用八進制。常量後綴/前綴是 C 語言類型系統在字面量層面的延伸。雖變量聲明已指定類型,但字面量自身類型決定了編譯期計算精度、隱式轉換行為與宏展開類型。養成「常量匹配後綴」習慣,能消除一大類隱蔽數值Bug,是專業 C 開發者的基本功。