1. 程式人生 > >C語言進階剖析 04 型別轉換

C語言進階剖析 04 型別轉換

型別之間的轉換

  • C語言中的數型別可以進行轉換
        ○ 強制型別轉換
        ○ 隱世型別轉換
void code_1()
{
    long l = 800;
    int i = (int)l;  // 強制型別轉換
}

void code_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;    // 0x1122
    
    char c = (char)s;    // 0x22
    
    int i = (int)s;        // 0x1122 
    
    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位元組!


隱式型別轉換

  • 編譯器主動進行的型別轉換
void code()
{
    char c = 0;    // 變數 c 佔用1個位元組
    short s = c;   // c 到 s 隱式型別轉換
    int i = s;     // s 到 i 隱式型別轉換
    long = i;      // i 到 l 隱式型別轉換
}
  • 注意:
        ○ 低型別到高型別的隱式轉換是安全的,不會產生截斷;
        ○ 高型別到低型別的隱式轉換是不安全的,導致不正確的結果。

表示式中的隱式型別轉換

  • 隱式型別轉換的發生點
        ○ 算術運算中,低型別轉化為高型別
        ○ 賦值表示式中,表示式的值轉換為左邊變數的型別
        ○ 函式呼叫時,實參轉換為形參的型別
        ○ 函式返回時,return 表示式轉換為返回值型別
    在這裡插入圖片描述

示例分析:隱式型別轉換分析

#include <stdio.h>

int main()
{
    char c = 'a';
    
    int i = c;   // safe
    
    unsigned int j = 0x11223344;
    
    short s = j; // unsafe, 發生截斷,編譯器未發出警告
    
    double d = 0.1;
    
    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)); // 升級為 int
    printf("sizeof(c + d) = %d\n", sizeof(c + d)); // 升級為 double
    
    return 0;
}        
輸出:
c = a
i = 97
j = 11223344
s = 3344
sizeof(c + s) = 4
sizeof(c + d) = 8


小結

  • 強制型別轉換由程式設計師負責完成
        ○轉換可能產生截斷
        ○轉換不區分型別的高低
        ○轉換不成功時,編譯器會給出錯誤資訊

  • 隱式型別轉換由編譯器自動完成
        ○低型別向高型別的轉換是安全的
        ○高型別向低型別的轉換是不安全的

注意:標準C編譯器的型別檢查是比較寬鬆的,因此隱式型別轉換可能帶來意外的錯誤。

內容參考狄泰軟體學院系列課程,如有侵權,請聯絡作者刪除!感謝~