C語言中的型別轉換



術語“型別轉換”是指將一種資料型別轉換為另一種資料型別。它也稱為“型別轉換”。在某些情況下,編譯器會自行執行轉換(隱式型別轉換),以便資料型別彼此相容。

在其他情況下,C編譯器會強制執行型別轉換(顯式型別轉換),這是由型別轉換運算子引起的。例如,如果要將“long”值儲存到簡單整數中,則可以將“long”型別轉換為“int”型別。

可以使用型別轉換運算子顯式地將值從一種型別轉換為另一種型別 -

(type_name) expression

示例 1

考慮以下示例 -

#include <stdio.h>

int main() {

   int sum = 17, count = 5;
   double mean;

   mean =  sum / count;
   printf("Value of mean: %f\n", mean);

}

輸出

執行程式碼並檢查其輸出 -

Value of mean: 3.000000

雖然我們期望結果為 17/5,即 3.4,但它顯示為 3.000000,因為除法表示式中的兩個運算元都是 int 型別。

示例 2

在 C 語言中,除法運算的結果始終為位元組長度較大的資料型別。因此,必須將其中一個整數運算元強制轉換為 float 型別。

強制轉換運算子導致將一個整數變數除以另一個整數變數作為浮點運算執行 -

#include <stdio.h>

int main() {

   int sum = 17, count = 5;
   double mean;

   mean = (double) sum / count;
   printf("Value of mean: %f\n", mean);
}

輸出

編譯並執行上述程式碼時,會產生以下結果 -

Value of mean: 3.400000

這裡需要注意的是,強制轉換運算子優先於除法,因此 sum 的值首先轉換為 double 型別,最後除以 count,得到一個 double 值。

型別轉換可以是編譯器自動執行的隱式轉換,也可以透過使用強制轉換運算子顯式指定。在需要型別轉換時使用強制轉換運算子被認為是良好的程式設計實踐。

型別提升規則

在執行隱式或自動型別轉換時,C 編譯器遵循型別提升規則。通常,遵循的原則是 -

  • 位元組和短整型 - 它們被提升為 int 型別。
  • 如果一個運算元為 long 型別 - 整個表示式被提升為 long 型別。
  • 如果一個運算元為 float 型別 - 整個表示式被提升為 float 型別。
  • 如果任何一個運算元為 double 型別 - 結果被提升為 double 型別。

C語言中的整數提升

整數提升是將小於 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);
}

輸出

編譯並執行上述程式碼時,會產生以下結果 -

Value of sum: 116

這裡,sum 的值為 116,因為編譯器正在執行整數提升並將 'c' 的值轉換為 ASCII 碼,然後執行實際的加法運算。

通常的算術轉換

通常的算術轉換不適用於賦值運算子,也不適用於邏輯運算子 && 和 ||。

示例

讓我們以以下示例來理解這個概念 -

#include <stdio.h>

int main() {

   int i = 17;
   char c = 'c';  /* ascii value is 99 */
   float sum;

   sum = i + c;
   printf("Value of sum : %f\n", sum);
}

輸出

編譯並執行上述程式碼時,會產生以下結果 -

Value of sum: 116.000000

這裡,很容易理解首先 c 被轉換為整數,但是由於最終值為 double 型別,因此應用了通常的算術轉換,編譯器將 i 和 c 轉換為 'float' 型別並相加,得到一個 'float' 型別的結果。

廣告