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

C語言隱式類型轉換規則詳解:signed 與 unsigned 運算陷阱

     編輯:關於C

核心問題

int 和 unsigned int 誰的數值範圍更大?

答案是 unsigned int。原因:int 的 0 有 +0/-0 之分(補碼表示下實際只有唯一 0,但符號位佔用一位),而 unsigned int 所有位均表示數值,故範圍更大。

實戰代碼分析

#include <stdio.h>

int main(int argc, char** argv) {
    int val = -15;
    unsigned int value = 13;
    int sum = value + val;
    printf("sum %d\n", sum);
    return 0;
}

輸出結果:sum -2

轉換規則推導

根據 C 標準「整數提升」與「常規算術轉換」:

  1. char、short 自動提升為 int
  2. unsigned char、unsigned short 提升為 unsigned int
  3. 混合 signed/unsigned 運算時,**數值範圍較小的類型向較大類型轉換**

本例中 val (int) 被轉為 unsigned int,即 4294967281 (32位)。相加得 4294967294,賦值給 int sum 時截斷為補碼 -2。

避坑指南

  • 避免混合有符號/無符號運算
  • 必要時顯式轉型:(int)value + val
  • 編譯器警告 -Wsign-compare / -Wsign-conversion 必開啟
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved