首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言 -2147483648 字面量類型陷阱:無符號常量導致比較異常

     編輯:程式設計綜合問答

現象


if (-2147483648 > 0)   // true  ❌
if ((int)-2147483648 > 0) // false ✅

根因:字面量類型推導規則

  1. 2147483648 超過 INT_MAX (2147483647),編譯器按無符號類型處理(unsigned int 或 long)。
  2. 一元負號 - 作用於無符號常量,結果仍為無符號(模 2^32 運算),值變為 2147483648u。
  3. 比較時 0 隱式轉為無符號,2147483648u > 0u 為真。
  4. 強轉 (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 選擇第一個能容納的類型;超過範圍則為無符號對應類型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved