首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言隱式類型轉換規則:整數提升、常規算術轉換與有符號陷阱

     編輯:關於C語言

核心法則:數值範圍大者勝

表達式中不同類型運算,範圍小的向範圍大的轉換。無符號範圍大於同位寬有符號(因無符號無負值位)。

轉換優先級(由低到高)

  1. char/short → int(整數提升)
  2. unsigned char/short → unsigned int
  3. 有符號 vs 無符號:有符號轉無符號
  4. 位寬低 → 位寬高
  5. 整數 → 浮點數

經典陷阱案例

int val = -15;
unsigned int value = 13;
int sum = value + val;  // val 隱式轉 unsigned int → 巨大正數
printf("%d\n", sum);    // 輸出 4294967294 (視為有符號 -2)

-15 作為 unsigned int 是 4294967281,加 13 得 4294967294,賦值給 int sum 截斷為 -2。

避坑檢查清單

  • 混合有符號/無符號運算 → 顯式轉型或統一用有符號
  • 比較運算:if (signed_var < unsigned_var) 先轉型
  • 位運算對象:務必用無符號類型,避免符號位擴展
  • 字符處理:char 有符號性未定義,用 unsigned char 處理原始字節

編譯器輔助

  • GCC/Clang: -Wsign-compare -Wsign-conversion -Wconversion
  • MSVC: /W4 含隱式轉換警告
  • 靜態分析:Cppcheck、Clang Static Analyzer
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved