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碼,然後執行實際的加法運算。

通常的算術轉換

通常的算術轉換是隱式執行的,將它們的值轉換為公共型別。編譯器首先執行整數提升;如果運算元的型別仍然不同,則它們將轉換為以下層次結構中出現最高的型別:

Long Double

示例

這是另一個隱式型別轉換的示例:

#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語言中使用隱式或顯式型別轉換有助於提高型別安全性和程式碼可讀性,但也可能導致精度損失,其複雜的語法也可能令人困惑。

廣告