C語言中文網 目錄
首頁 > 編程筆記 > C語言筆記 閱讀:5,811

C語言自動類型轉換

所謂“各類型數據之間的混合運算”就是指,當參加一個運算的數據的類型不同時運算的法則是什么。首先變量的數據類型是可以轉換的。轉換的方法有兩種,一種是自動轉換,另一種是強制轉換。
  • 自動轉換即當不同類型的數據進行混合運算時,編譯系統將按照一定的規則自動完成。
  • 而強制類型轉換是由程序員通過編程強制轉換數據的類型。

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

自動轉換的規則如下:

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("Hello\n");
    }
    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) 在賦值運算中,當賦值號兩邊的數據類型不同時,右邊的類型會轉換為左邊的類型,然后再賦給左邊。如果右邊數據類型的長度比左邊長,那么將會丟失數據,這樣就會降低精度,所以編譯的時候會產生警告。

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

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo