if (-2147483648 > 0) // true ❌
if ((int)-2147483648 > 0) // false ✅
2147483648 超過 INT_MAX (2147483647),編譯器按無符號類型處理(unsigned int 或 long)。- 作用於無符號常量,結果仍為無符號(模 2^32 運算),值變為 2147483648u。0 隱式轉為無符號,2147483648u > 0u 為真。(int) 後截斷為有符號 -2147483648,比較恢復正常。MSVC 會報 C4146:「一元負號運算符應用於無符號類型,結果仍為無符號」。
INT_MIN (<limits.h>) 替代魔數。-2147483648L (long) 或 -2147483648LL (long long)。-Wsign-compare (GCC/Clang) 捕獲符號比較隱患。C99 6.4.4.1:十進制常量類型按 int → long → long long 選擇第一個能容納的類型;超過範圍則為無符號對應類型。