假設 w 位元有號整數,範圍 [-2^{w-1}, 2^{w-1}-1]。
x > 0, y > 0, x + y >= 2^{w-1}
等價判斷:x >= 2^{w-1} - y
x < 0, y < 0, x + y < -2^{w-1}
等價判斷:x < -2^{w-1} - y
// 錯誤:編譯器可能優化掉溢位檢查 if (x + y < x) ... // 若 x,y 同為正,x+y 溢位為負,但編譯器假設無 UB 可能直接判斷 false // 正確:先檢查條件再運算 if (y > 0 && x > INT_MAX - y) ... // 正溢位 if (y < 0 && x < INT_MIN - y) ... // 負溢位
<stdckdint.h> 提供檢測溢位的內建函數:
int result;
if (ckd_add(&result, x, y)) { /* 處理溢位 */ }