基本數據類型詳細說明
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 int | 2字節 | -32,768 ~ 32,767 |
| 整型 | int / signed int | 4字節 | -2³¹ ~ 2³¹-1 |
| 長整型 | long / long int | 4字節 | -2³¹ ~ 2³¹-1 |
| 長長整型 | long long (C99) | 8字節 | -2⁶³ ~ 2⁶³-1 |
| 無符號 | unsigned int | 4字節 | 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. 浮點類型
| 類型 | 關鍵字 | 大小 | 精度 | 常量後綴 |
| 單精度 | float | 4字節 | 7位有效數字 | f/F (3.14f) |
| 雙精度 | double | 8字節 | 15-16位 | 默認 (3.14) |
| 長雙精度 | long double | 10/16字節 | 更高 | L/l (3.14L) |
⚠️ 浮點數為近似值,不可直接用==比較相等。
常量類型自動推導規則
3 → int
3.5 → double
3.5f → float
35L → long
35LL → long long
35u → unsigned int
35UL → unsigned long
運算符優先級與結合性
() [] -> . 最高
++ -- + - ! ~ (type) * & sizeof 單目運算符(右結合)
* / % 算術
+ - 算術
<< >> 移位
< <= > >= 關系
== != 相等
& 位與
^ 位異或
| 位或
&& 邏輯與
|| 邏輯或
?: 三目(右結合)
= += -= *= /= %= &= ^= |= <<= >>= 賦值(右結合)
, 逗號 最低
重點運算符詳細講解
算術運算符
- 整數除法:截斷小數部分(
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++ 後置 | 先用後增 | 舊值 |
⚠️ 最佳實踐: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
位運算符(僅限整數/字符)
| 運算符 | 名稱 | 規則 | 典型用途 |
& | 位與 | 同為1得1 | 清零特定位、取值 |
| | 位或 | 同為0得0 | 置位特定位 |
~ | 位非 | 按位取反 | ~x+1 = -x (補碼) |
^ | 位異或 | 異為1同為0 | 翻轉特定位、交換變量 |
<< | 左移 | 低位補0 | ×2ⁿ (高效乘法) |
>> | 右移 | 有符號補符號位,無符號補0 | ÷2ⁿ (高效除法) |
地址與間接運算符
&var:取變量地址(scanf必需)
*ptr:解引用,訪問地址指向的值
%p:打印地址(十六進制)
三目運算符
條件 ? 表達式1 : 表達式2
// 等價於
if (條件) 值 = 表達式1; else 值 = 表達式2;
int max = (a > b) ? a : b; // 取最大值
double val = (a > 10) ? 9.0 : 8; // 類型自動提升為double
類型轉換規則
- 隱式轉換(整型提升/算術轉換):
- 小於
int(char/short)→ int
- 有
float/double → 向最高浮點類型轉換
- 無浮點:按
int/unsigned/long/long long 依次提升
- 強制類型轉換:
(目標類型) 表達式
char c = (char) 300; // 截斷高位,結果 44
double d = (double) 5 / 2; // 2.5 (先轉後算)
int i = 5 / 2; // 2 (整數除法)
綜合練習題
- 輸入小寫字母,輸出對應大寫(利用ASCII碼差值
'a' - 'A' = 32)
- 逆序輸出兩位數(
num%10*10 + num/10)
- 計算輸入整數的位數(
do-while 循環 num/=10 計數)
總結
掌握C語言數據類型與運算符需重點理解:內存表示(補碼)、隱式轉換規則、運算符優先級結合性、短路求值、位運算技巧。這些是編寫高效、無Bug C代碼的基石,也是嵌入式、系統級開發的核心基本功。
- 上一篇文章: MFC入門開發常見問題與解決方案匯總
- 下一篇文章: gSOAP實現C++ Web Service服務端與PHP客戶端通信實戰
Copyright ©
程式碼之家 All Rights Reserved