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

C語言進階:基本數據類型深度解析與運算符全攻略

     編輯:關於C語言

基本數據類型詳細說明

1. 字符類型 char

  • 佔用 1字節(8位),存儲ASCII碼值
  • 字符常量用單引號:'A',字符串用雙引號:"ABC"
  • 字符具備雙重特性:顯示為圖形,存儲為編碼整數('A'=65, 'a'=97, '0'=48)
  • sizeof(char) == 1 恒成立
char c1 = 'A';      // 65
char c2 = 97;       // 'a'
c1 = c1 + 1;        // 'B' (66)
char c3 = '9';
int num = c3 - '0'; // 字符'9'轉數字9 → 9

2. 整型 int 族

類型關鍵字典型大小範圍(32位系統)
短整型short / short int2字節-32,768 ~ 32,767
整型int / signed int4字節-2³¹ ~ 2³¹-1
長整型long / long int4字節-2³¹ ~ 2³¹-1
長長整型long long (C99)8字節-2⁶³ ~ 2⁶³-1
無符號unsigned int4字節0 ~ 2³²-1

進制表示:八進制0開頭(011=9),十六進制0x開頭(0xF1=241)。

有符號數與無符號數內存表示

  • 有符號:最高位為符號位(0正/1負),採用補碼存儲
  • 無符號:所有位參與數值表示
  • 相同位模式,按有符號/無符號解釋結果不同:
int a = -1;           // 0xFFFFFFFF
unsigned int b = -1;  // 0xFFFFFFFF = 4,294,967,295
printf("%d %u", a, b); // -1 4294967295

補碼轉換規則(核心考點)

  • 正數:原碼=反碼=補碼
  • 負數:對正數補碼按位取反+1
  • 負數轉十進制:補碼減1再取反或取反再加1得正數,加負號
-107: 107=01101011 → 取反10010100 → +1=10010101
11100111: 減1=11100110 → 取反=00011001=25 → -25

3. 浮點類型

類型關鍵字大小精度常量後綴
單精度float4字節7位有效數字f/F (3.14f)
雙精度double8字節15-16位默認 (3.14)
長雙精度long double10/16字節更高L/l (3.14L)

⚠️ 浮點數為近似值,不可直接用==比較相等。

常量類型自動推導規則

  • 3 → int
  • 3.5 → double
  • 3.5f → float
  • 35L → long
  • 35LL → long long
  • 35u → unsigned int
  • 35UL → unsigned long

運算符優先級與結合性

  1. () [] -> . 最高
  2. ++ -- + - ! ~ (type) * & sizeof 單目運算符(右結合)
  3. * / % 算術
  4. + - 算術
  5. << >> 移位
  6. < <= > >= 關系
  7. == != 相等
  8. & 位與
  9. ^ 位異或
  10. | 位或
  11. && 邏輯與
  12. || 邏輯或
  13. ?: 三目(右結合)
  14. = += -= *= /= %= &= ^= |= <<= >>= 賦值(右結合)
  15. , 逗號 最低

重點運算符詳細講解

算術運算符

  • 整數除法:截斷小數部分(5/2=2)
  • 取模%:僅適用整數,a%b 符號與 a 同(C99)
  • 混合運算:int 自動提升為 double
  • 除零:整數除零 → 運行時錯誤;浮點數除零 → inf

賦值運算符

  • 右結合:a = b = c = 0 等價 a = (b = (c = 0))
  • 左值要求:左側必須是可修改的實體(變量),不可為表達式/常量
  • 複合賦值:a += b ≡ a = a + b

自增自減 ++/--

⚠️ 最佳實踐:i++/++i 作為獨立語句使用,避免混合在複雜表達式中導致未定義行為。

邏輯運算符與短路求值

  • !expr:邏輯非
  • expr1 && expr2:邏輯與,**左側為假則右側不計算**
  • expr1 || expr2:邏輯或,**左側為真則右側不計算**
int i=0, j=0;
if (i++ && j++) {}  // i=1(假), j不執行 → i=1, j=0
if (i-- || j++) {}  // i=0(真), j不執行 → i=0, j=0

位運算符(僅限整數/字符)

形式操作順序表達式值
++i 前置先增後用新值
i++ 後置先用後增舊值

地址與間接運算符

  • &var:取變量地址(scanf必需)
  • *ptr:解引用,訪問地址指向的值
  • %p:打印地址(十六進制)

三目運算符

條件 ? 表達式1 : 表達式2
// 等價於
if (條件) 值 = 表達式1; else 值 = 表達式2;
int max = (a > b) ? a : b;  // 取最大值
double val = (a > 10) ? 9.0 : 8;  // 類型自動提升為double

類型轉換規則

  1. 隱式轉換(整型提升/算術轉換):
    • 小於int(char/short)→ int
    • 有float/double → 向最高浮點類型轉換
    • 無浮點:按int/unsigned/long/long long 依次提升
  2. 強制類型轉換:(目標類型) 表達式
    char c = (char) 300;  // 截斷高位,結果 44
    double d = (double) 5 / 2;  // 2.5 (先轉後算)
    int i = 5 / 2;  // 2 (整數除法)
    

綜合練習題

  1. 輸入小寫字母,輸出對應大寫(利用ASCII碼差值 'a' - 'A' = 32)
  2. 逆序輸出兩位數(num%10*10 + num/10)
  3. 計算輸入整數的位數(do-while 循環 num/=10 計數)

總結

掌握C語言數據類型與運算符需重點理解:內存表示(補碼)、隱式轉換規則、運算符優先級結合性、短路求值、位運算技巧。這些是編寫高效、無Bug C代碼的基石,也是嵌入式、系統級開發的核心基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
運算符名稱規則典型用途
&位與同為1得1清零特定位、取值
|位或同為0得0置位特定位
~位非按位取反~x+1 = -x (補碼)
^位異或異為1同為0翻轉特定位、交換變量
<<左移低位補0×2ⁿ (高效乘法)
>>右移有符號補符號位,無符號補0÷2ⁿ (高效除法)