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

C/C++ 賦值運算中的隱式類型轉換:截斷、符號擴展與精度損失

     編輯:C++ 入門

轉換規則速查

源類型 → 目標類型行為示例
int → char截斷高位,保留低 8 位258 → 2
char → int符號擴展(signed char)或零擴展(unsigned char)-1 → -1 (0xFF→0xFFFFFFFF)
float → int截斷小數部分,向零取整3.9 → 3, -3.9 → -3
int → float精確表示(≤2^24),否則四捨五入到最近可表示值16777217 → 16777216.0
signed → unsigned按補碼重新解釋位模式-1 → 4294967295 (32位)
unsigned → signed若值超範圍,實現定義行為(通常同補碼重解釋)4294967295 → -1

代碼驗證關鍵案例

// 1. 窄化轉換:int → char
int i = 258; char c = i; // c == 2 (0x02)

// 2. 符號擴展:char → int
signed char sc = -1; int si = sc; // si == -1 (0xFFFFFFFF)
unsigned char uc = 255; int ui = uc; // ui == 255 (0x000000FF)

// 3. 有符號/無符號混合
unsigned u = 10; signed s = -5;
auto res = u + s; // s 隱式轉 unsigned,結果為巨大正數 (4294967301)

// 4. 浮點精度
float f = 16777217.0f; // 2^24+1
cout << (int)f; // 輸出 16777216,精度丟失

最佳實踐

  • 開啟編譯器警告 -Wconversion -Wsign-conversion(GCC/Clang)或 /W4(MSVC),捕獲隱式窄化。
  • 用 static_cast 顯式標註有意轉換,文檔化意圖。
  • 避免有符號/無符號混合運算,統一用 int64_t 或 uint64_t。
  • 浮點比較用 fabs(a-b) < eps,勿用 ==。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved