
- C程式設計教程
- C語言 - 首頁
- C語言基礎
- C語言 - 概述
- C語言 - 特性
- C語言 - 歷史
- C語言 - 環境搭建
- C語言 - 程式結構
- C語言 - Hello World
- C語言 - 編譯過程
- C語言 - 註釋
- C語言 - 詞法單元
- C語言 - 關鍵字
- C語言 - 識別符號
- C語言 - 使用者輸入
- C語言 - 基本語法
- C語言 - 資料型別
- C語言 - 變數
- C語言 - 整數提升
- C語言 - 型別轉換
- C語言 - 型別強制轉換
- C語言 - 布林值
- C語言中的常量和字面量
- C語言 - 常量
- C語言 - 字面量
- C語言 - 轉義序列
- C語言 - 格式說明符
- C語言中的運算子
- C語言 - 運算子
- C語言 - 算術運算子
- C語言 - 關係運算符
- C語言 - 邏輯運算子
- C語言 - 位運算子
- C語言 - 賦值運算子
- C語言 - 一元運算子
- C語言 - 自增和自減運算子
- C語言 - 三元運算子
- C語言 - sizeof運算子
- C語言 - 運算子優先順序
- C語言 - 其他運算子
- C語言中的決策
- C語言 - 決策
- C語言 - if語句
- C語言 - if...else語句
- C語言 - 巢狀if語句
- C語言 - switch語句
- C語言 - 巢狀switch語句
- C語言中的迴圈
- C語言 - 迴圈
- C語言 - while迴圈
- C語言 - for迴圈
- C語言 - do...while迴圈
- C語言 - 巢狀迴圈
- C語言 - 無限迴圈
- C語言 - break語句
- C語言 - continue語句
- C語言 - goto語句
- C語言中的函式
- C語言 - 函式
- C語言 - 主函式
- C語言 - 按值呼叫函式
- C語言 - 按引用呼叫函式
- C語言 - 巢狀函式
- C語言 - 可變引數函式
- C語言 - 使用者自定義函式
- C語言 - 回撥函式
- C語言 - return語句
- C語言 - 遞迴
- C語言中的作用域規則
- C語言 - 作用域規則
- C語言 - 靜態變數
- C語言 - 全域性變數
- C語言中的陣列
- C語言 - 陣列
- C語言 - 陣列的特性
- C語言 - 多維陣列
- C語言 - 將陣列傳遞給函式
- C語言 - 從函式返回陣列
- C語言 - 變長陣列
- C語言中的指標
- C語言 - 指標
- C語言 - 指標和陣列
- C語言 - 指標的應用
- C語言 - 指標運算
- C語言 - 指標陣列
- C語言 - 指向指標的指標
- C語言 - 將指標傳遞給函式
- C語言 - 從函式返回指標
- C語言 - 函式指標
- C語言 - 指向陣列的指標
- C語言 - 指向結構體的指標
- C語言 - 指標鏈
- C語言 - 指標與陣列
- C語言 - 字元指標和函式
- C語言 - 空指標
- C語言 - void指標
- C語言 - 懸空指標
- C語言 - 解引用指標
- C語言 - 近、遠和巨型指標
- C語言 - 指標陣列的初始化
- C語言 - 指標與多維陣列
- C語言中的字串
- C語言 - 字串
- C語言 - 字串陣列
- C語言 - 特殊字元
- C語言中的結構體和聯合體
- C語言 - 結構體
- C語言 - 結構體和函式
- C語言 - 結構體陣列
- C語言 - 自引用結構體
- C語言 - 查詢表
- C語言 - 點(.)運算子
- C語言 - 列舉(enum)
- C語言 - 結構體填充和打包
- C語言 - 巢狀結構體
- C語言 - 匿名結構體和聯合體
- C語言 - 聯合體
- C語言 - 位域
- C語言 - typedef
- C語言中的檔案處理
- C語言 - 輸入輸出
- C語言 - 檔案I/O (檔案處理)
- C語言預處理器
- C語言 - 預處理器
- C語言 - 編譯指示
- C語言 - 預處理器運算子
- C語言 - 宏
- C語言 - 標頭檔案
- C語言中的記憶體管理
- C語言 - 記憶體管理
- C語言 - 記憶體地址
- C語言 - 儲存類別
- 其他主題
- C語言 - 錯誤處理
- C語言 - 可變引數
- C語言 - 命令執行
- C語言 - 數學函式
- C語言 - static關鍵字
- C語言 - 隨機數生成
- C語言 - 命令列引數
- C程式設計資源
- C語言 - 問答
- C語言 - 快速指南
- C語言 - 速查表
- C語言 - 有用資源
- C語言 - 討論
C語言中的型別轉換
C編譯器嘗試進行資料型別轉換,尤其是在表示式中出現不同資料型別時。在某些情況下,編譯器會自行進行轉換(隱式型別轉換),以確保資料型別相容。在其他情況下,C編譯器會強制執行轉換(顯式型別轉換),這由型別強制轉換運算子執行。
C語言中的隱式型別轉換
在C語言中,隱式型別轉換在編譯器將賦值給變數的值的型別轉換為另一種資料型別時自動發生。這通常發生在將位元組大小較小的型別賦值給“較大”的資料型別時。在這種隱式資料型別轉換中,資料完整性得以保留。
在執行隱式或自動型別轉換時,C編譯器遵循型別提升規則。通常遵循的原則是:
位元組和短整型值:它們被提升為int。
如果一個運算元是long:整個表示式被提升為long。
如果一個運算元是float:整個表示式被提升為float。
如果任何運算元是double:結果被提升為double。
整數提升
整數提升是將小於int或unsigned int的整數型別的值轉換為int或unsigned int的過程。
示例
考慮一個將字元與整數相加的示例:
#include <stdio.h> int main(){ int i = 17; char c = 'c'; /* ascii value is 99 */ int sum; sum = i + c; printf("Value of sum: %d\n", sum); return 0; }
輸出
執行此程式碼時,將產生以下輸出:
Value of sum: 116
這裡,sum的值是116,因為編譯器正在進行整數提升並將“c”的值轉換為ASCII碼,然後執行實際的加法運算。
通常的算術轉換
通常的算術轉換是隱式執行的,將它們的值轉換為公共型別。編譯器首先執行整數提升;如果運算元的型別仍然不同,則它們將轉換為以下層次結構中出現最高的型別:

示例
這是另一個隱式型別轉換的示例:
#include <stdio.h> int main(){ char a = 'A'; float b = a + 5.5; printf("%f", b); return 0; }
輸出
執行程式碼並檢查其輸出:
70.500000
當上述程式碼執行時,char變數“a”(其int等效值為70)被提升為float,因為加法表示式中的另一個運算元是float。
C語言中的顯式型別轉換
當需要將位元組大小較大的資料型別轉換為位元組大小較小的資料型別時,需要明確告知編譯器您的意圖。這稱為顯式型別轉換。
C提供了一個型別強制轉換運算子。需要在要轉換的運算元之前加上資料型別括號。
type2 var2 = (type1) var1;
請注意,如果type1的長度小於type2,則不需要這種顯式強制轉換。只有當type1的長度大於type2時,才應使用型別強制轉換運算子。
當需要將更大的資料型別變數降級為較小的變數或在不相關的型別(如float到int)之間轉換時,需要進行型別強制轉換。
示例
考慮以下程式碼:
#include <stdio.h> int main(){ int x = 10, y = 4; float z = x/y; printf("%f", z); return 0; }
輸出
執行此程式碼後,您將獲得以下輸出:
2.000000
雖然我們期望結果為10/4(即2.5),但它顯示為2.000000。這是因為除法表示式中的兩個運算元都是int型別。在C語言中,除法運算的結果始終是位元組長度較大的資料型別。因此,我們必須將其中一個整數運算元強制轉換為float,如下所示:
示例
看看這個例子:
#include <stdio.h> int main(){ int x = 10, y = 4; float z = (float)x/y; printf("%f", z); return 0; }
輸出
執行程式碼並檢查其輸出:
2.500000
如果我們更改表示式,使得除法本身強制轉換為float,則結果將不同。
C語言中的型別轉換函式
標準C庫包含許多執行型別轉換的函式。這裡解釋其中一些函式:
atoi()函式
atoi()函式將字串轉換為整數值。該函式在stdlib.h標頭檔案中宣告。
示例
以下程式碼使用atoi()函式將字串“123”轉換為數字123:
#include <stdio.h> #include <stdlib.h> int main(){ char str[] = "123"; int num = atoi(str); printf("%d\n", num); return 0; }
輸出
執行程式碼並檢查其輸出:
123
itoa()函式
可以使用itoa()函式將整數轉換為以null結尾的字元字串。該函式在stdlib.h標頭檔案中宣告。
示例
以下程式碼使用itoa()函式將整數123轉換為字串“123”:
#include <stdio.h> #include <stdlib.h> int main(){ int num = 123; char str[10]; itoa(num,str, 10); printf("%s\n", str); return 0; }
輸出
執行程式碼並檢查其輸出:
123
使用型別強制轉換的其他示例包括:
malloc()函式 - malloc()函式是動態記憶體分配函式。
Int *ptr = (int*)malloc(n * sizeof(int));
在函式引數和返回值中 - 可以將型別強制轉換運算子應用於形式引數或使用者定義函式的返回值。
示例
這是一個例子:
#include <stdio.h> #include <stdlib.h> float divide(int, int); int main(){ int x = 10, y = 4; float z = divide(x, y); printf("%f", z); return 0; } float divide(int a, int b){ return (float)a/b; }
輸出
執行此程式碼時,將產生以下輸出:
2.500000
在C語言中使用隱式或顯式型別轉換有助於提高型別安全性和程式碼可讀性,但也可能導致精度損失,其複雜的語法也可能令人困惑。