天天看點

C語言 第4課 類型轉換

類型之間的轉換

  • C語言中的資料類型可以進行轉換

        ○ 強制類型轉換

        ○ 隐式類型轉換

void main_1() 
{ 
    long l = 800; 
    int i = (int)l; // 強制類型轉換 
} 

void mian_2() 
{ 
    short s = 800; 
    int i = s;      // 隐式類型轉換 
                    // no error, no warning 
}
           

強制類型轉換

  •     強制類型轉換的文法

        ○ (Type)var_name;

        ○ (Type)value;

  •     強制類型轉換的結果

        ○ 目标類型能夠容納目标值:結果不變

        ○ 目标類型不能容納目标值:結果将産生中斷

注意:不是所有的強制類型轉換都能成功,當不能進行強制類型轉換時,編譯器将産生錯誤資訊。

執行個體分析:強制類型轉換

#include <stdio.h>

struct TS
{
    int i;
    int j;
};

struct TS ts;

int main()
{
    short s = 0x1122;
    
    char c = (char)s;    // 0x22
    
    int i = (int)s;      // 0x00001122
    
    int j = (int)3.1415; // 3
    
    unsigned int p = (unsigned int)&ts;
    
    long l = (long)ts;   // error
    
    ts = (struct TS)l;   // error
    
    printf("s = %x\n", s);
    printf("c = %x\n", c);
    printf("i = %x\n", i);
    printf("j = %x\n", j);
    printf("p = %x\n", p);
    printf("&ts = %p\n", &ts);
    
    return 0;
}
           
輸出:
s = 1122
c = 22
i = 1122
j = 3
p = 804a01c
&ts = 0x804a01c
           

注意:unsigned int p = (unsigned int)&ts; 在64位機時,将發生資料截斷。64位機器指針占8位元組!表達式中的

隐式類型轉換

  • 編譯器主動進行的類型轉換
char c = 0;    // 變量 c 占用1個位元組 
short s = c;   // c 到 s 隐式類型轉換 
int i = s;     // s 到 i 隐式類型轉換 
long = i;      // i 到 l 隐式類型轉換 
           

注意:

    ○ 低類型到高類型的隐式轉換是安全的,不會産生截斷;

    ○ 高類型到低類型的隐式轉換是不安全的,導緻不正确的結果。

表達式中的隐式類型轉換

  • 隐式類型轉換的發生點
    • 算術運算中,低類型轉化為高類型
    •  指派表達式中,表達式的值轉換為左邊變量的類型
    • 函數調用時,實參轉換為形參的類型
    • 函數傳回時,return 表達式轉換為傳回值類型
C語言 第4課 類型轉換

執行個體分析:隐式類型轉換

#include <stdio.h>

int main()
{
    char c = 'a';
    
    int i = c;    // safe
    
    unsigned int j = 0x11223344;
    
    short s = j;  // unsafe
    
    printf("c = %c\n", c);
    printf("i = %d\n", i);
    printf("j = %x\n", j);
    printf("s = %x\n", s);
    printf("sizeof(c + s) = %d\n", sizeof(c + s));
    
    return 0;
}
           
輸出:
c = a
i = 97
j = 11223344
s = 3344
sizeof(c + s) = 4
sizeof(c + d) = 8
           

小結

    強制類型轉換由程式員負責完成

        ○轉換可能産生截斷

        ○轉換不區分類型的高低

        ○轉換不成功時,編譯器會給出錯誤資訊

    隐式類型轉換由編譯器自動完成

        ○低類型向高類型的轉換是安全的

        ○高類型向低類型的轉換是不安全的

注意:标準C編譯器的類型檢查是比較寬松的,是以隐式類型轉換可能帶來意外的錯誤。