轉換規則速查
| 源類型 → 目標類型 | 行為 | 示例 |
| int → char | 截斷高位,保留低 8 位 | 258 → 2 |
| char → int | 符號擴展(signed char)或零擴展(unsigned char) | -1 → -1 (0xFF→0xFFFFFFFF) |
| float → int | 截斷小數部分,向零取整 | 3.9 → 3, -3.9 → -3 |
| int → float | 精確表示(≤2^24),否則四捨五入到最近可表示值 | 16777217 → 16777216.0 |
| signed → unsigned | 按補碼重新解釋位模式 | -1 → 4294967295 (32位) |
| unsigned → signed | 若值超範圍,實現定義行為(通常同補碼重解釋) | 4294967295 → -1 |
代碼驗證關鍵案例
// 1. 窄化轉換:int → char
int i = 258; char c = i; // c == 2 (0x02)
// 2. 符號擴展:char → int
signed char sc = -1; int si = sc; // si == -1 (0xFFFFFFFF)
unsigned char uc = 255; int ui = uc; // ui == 255 (0x000000FF)
// 3. 有符號/無符號混合
unsigned u = 10; signed s = -5;
auto res = u + s; // s 隱式轉 unsigned,結果為巨大正數 (4294967301)
// 4. 浮點精度
float f = 16777217.0f; // 2^24+1
cout << (int)f; // 輸出 16777216,精度丟失
最佳實踐
- 開啟編譯器警告
-Wconversion -Wsign-conversion(GCC/Clang)或 /W4(MSVC),捕獲隱式窄化。
- 用
static_cast 顯式標註有意轉換,文檔化意圖。
- 避免有符號/無符號混合運算,統一用
int64_t 或 uint64_t。
- 浮點比較用
fabs(a-b) < eps,勿用 ==。