C語言自動型別轉換

2020-07-16 10:04:24
所謂“各型別資料之間的混合運算”就是指,當參加一個運算的資料的型別不同時運算的法則是什麼。首先變數的資料型別是可以轉換的。轉換的方法有兩種,一種是自動轉換,另一種是強制轉換。
  • 自動轉換即當不同型別的資料進行混合運算時,編譯系統將按照一定的規則自動完成。
  • 而強制型別轉換是由程式設計師通過程式設計強制轉換資料的型別。

本節之講解自動轉換,強制轉換將在後續章節中再講解。

自動轉換的規則如下:

1) 當參與運算的資料的型別不同時,編譯系統會自動先將它們轉換成同一型別,然後再進行運算。

但問題是轉換的時候是誰轉換成誰呢?轉換的基本規則是“按資料長度增加的方向進行轉換”,以保證精度不降低。比如 int 型資料和 long 型資料進行相加或相減運算時,系統會先將 int 型資料轉換成 long 型,然後再進行運算。這樣的話運算結果的精度就不會降低。

long 是“大水桶”,int 是“小水桶”。int 能存放的,long 肯定能存放;而 long 能存放的,int 不一定能存放。

2) 所有的浮點運算都是以雙精度進行的。

在運算時,程式中所有的 float 型資料全部都會先轉換成 double 型。即使只有一個 float 型資料,也會先轉換成 double 型,然後再進行運算。為什麼要這樣呢?因為 CPU 在運算的時候有“位元組對齊”的要求,這樣運算的速度是最快的。這個現在先不管,如果以後有機會學習組合的話你就知道原因了。

3) char 型和 short 型資料參與運算時,必須先轉換成 int 型。這也是涉及 CPU 的執行原理的,記住就行了。

4) 有符號整型和無符號整型混合運算時,有符號型要轉換成無符號型,運算的結果是無符號的。這條規則經常使人糾結,可以寫一個程式看一下。
本程式的部分語法讀者可能看不懂,沒關係,忽略即可,後續我們會詳細講解。
# include <stdio.h>
int main(void)
{
    int a = -10;
    unsigned b = 5;
    if ((a+b) > 0)
    {
        printf("Hellon");
    }
    return 0;
}
在 VC++ 6.0 中的輸出結果是:
Hello

程式的意思是分別定義一個有符號整型 a 和無符號整型 b。然後分別將 –10 和 5 賦給 a 和 b,如果 a+b 的值大於 0 就輸出 Hello。理論上講 –10+5 的值為 –5,所以不可能輸出 Hello。但是我們從輸出的結果可以看出,Hello 被輸出了。這說明 a+b 的值是正數,即是無符號的。這就是這個規則。

5) 整型和浮點型混合運算時,整型先轉換成浮點型,運算的結果是浮點型。

6) 在賦值運算中,當賦值號兩邊的資料型別不同時,右邊的型別會轉換為左邊的型別,然後再賦給左邊。如果右邊資料型別的長度比左邊長,那麼將會丟失資料,這樣就會降低精度,所以編譯的時候會產生警告。

本小節的內容大家了解一下就行了。因為在實際程式設計中,至少就初學而言,不同型別資料之間的混合運算是很少見的。最多也就是整型和浮點型的混合運算。但是試卷上的題目除外!