在 C 語言中,115L 中的 L 是長整數後綴,指示編譯器將該字面常數視為 long int 型別。本文系統梳理所有標準後綴、型別推導優先級、以及跨平台可攜性陷阱。
| 後綴 | 大小寫 | 含義 | 最小型別 | 範例 |
|---|---|---|---|---|
u / U | 不區分 | 無號 | unsigned int | 100U |
l / L | 不區分(建議大寫) | 長整數 | long int | 115L |
ll / LL | 不區分(建議大寫) | 長長整數 | long long int (C99) | 123LL |
| 組合 | 任意順序 | 無號+長度 | 對應組合型別 | 100UL, 42ULL |
f / F | 不區分 | 單精度浮點 | float | 3.14F |
無 / l / L | 浮點數 | 雙精度/長雙精度 | double / long double | 3.14, 3.14L |
編譯器按值能容納的最小型別依序嘗試:
十進位:int → long int → long long int 八/十六進位:int → unsigned int → long int → unsigned long int → long long int → unsigned long long int
實例(假設 32-bit int, 64-bit long):
2147483647 → int (INT_MAX)
2147483648 → long int (INT_MAX+1)
4294967295 → unsigned int (UINT_MAX)
4294967296 → long int (若 long 64-bit) 或 long long int
9223372036854775807 → long long int (LLONG_MAX)
115L 實戰意義
// 強制長整數運算,避免 int 溢位
long val = 115L * 1000000; // 115,000,000
// 函式多載/泛選擇 (C11 _Generic)
#define PRINT_LONG(x) _Generic((x), long: puts("long"), default: puts("other"))
PRINT_LONG(115); // 可能輸出 "other" (視平台 int/long 大小)
PRINT_LONG(115L); // 永遠輸出 "long"
| 陷阱 | 錯誤現象 | 修正 |
|---|---|---|
| 八進位前導零 | 018 編譯錯誤 (8 非八進位數字) | 避免前導零,或用 0o (C23) |
| 字面常數溢位 | int x = 2147483648; 警告/錯誤 | 加 L 或 LL:2147483648L |
| 無號負數 | -1U 實為巨大正數 | 理解模運算語意,勿混用 |
l 與 1 混淆 | 100l 易誤讀 | 永遠用大寫 L |
<stdint.h>)現代 C 專案推薦使用巨集而非後綴:
#include <stdint.h>
#include <inttypes.h>
int32_t a = INT32_C(115); // 精確 32-bit 有號
uint64_t b = UINT64_C(115); // 精確 64-bit 無號
printf("a=%" PRId32 ", b=%" PRIu64 "\n", a, b);
INT32_C 會自動展開為適當後綴,確保跨平台型別一致。
L 後綴是 C 語言型別系統向程式設計師暴露的精確控制桿。理解「值決定型別」的推導規則、善用 U/L/LL 組合、轉向 <stdint.h> 固定寬度巨集,能消除 90% 的整數字面常數相關 Bug,也是編寫可攜式、高可靠性系統軟體的基本功。