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

ANSI C 整型提升與尋常算術轉換完整規則詳解

     編輯:關於C語言

整型提升

char、short、_Bool、位域、枚舉類型 → int(若 int 能表示所有值),否則 → unsigned int。

此提升發生於:變量參與表達式、作為無原型函數參數、可變參數函數(如 printf)參數。

尋常算術轉換

兩操作數類型不同時,按下列優先級轉換(高→低):

  1. long double
  2. double
  3. float
  4. 整型提升後:unsigned long long → long long → unsigned long → long → unsigned int → int

值保持原則:優先轉向有號類型(若能完整表示),否則轉無號。不同於 K&R C 的「無號保持」。

經典陷阱:有號/無號比較


int d = -1;
size_t sz = 10;
if (d <= sz)  // d 被轉為 unsigned int (巨大正數),條件恆真!

修正:if (d <= (int)sz) 或統一使用有號類型表示數量。

隱式轉換其他場景

  • sizeof 'A' → 4(字符常量類型為 int,而非 char)。
  • 函數參數傳遞:有原型則不提升;無原型/可變參數則提升。
  • printf("%d", ch):char 提升為 int 入棧,%d 正確讀取。

最佳實踐

  • 避免混合有號/無號運算;必要時顯式轉型。
  • 位操作、掩碼專用無號類型。
  • 啟用編譯器警告 -Wsign-compare -Wconversion。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved