1. 程式人生 > >C語言進階學習1 隱式型別轉換和強制型別轉換

C語言進階學習1 隱式型別轉換和強制型別轉換

本部落格記錄狄泰學院課程的學習
學習交流群:320628659
個人QQ:1367087622
歡迎大家交流學習
本章的學習目標:
學習隱式型別轉換和強制型別轉換的基本概念.
本意或非本意下使用型別轉換時可能會出現的問題.

在C語言是可以進行型別之間的轉換且其中存在兩種型別轉換的方式

  • 強制型別轉換
  • 隱式型別轉換

強制型別轉換

  • 強制型別轉換的語法
    • (Type)var_name;
    • (Type)value;

    (想轉換的目標型別)變數名或具體數值

  • 強制型別轉換的結果
    • 目標的型別能夠容納目標值:結果不變
    • 目標的型別不能容納目標值:結果產生截斷

    注意:1. 結果產生截斷還與作業系統的大小端有關.
    2.並不是所有的強制型別轉換都能夠成功,當不能進行強制型別轉換時,編譯器會產生錯誤資訊.

補充一個知識高低位,0x12345678 ,其中12為高位,78為低位

從程式碼上表述強制型別轉換

#include <stdio.h>

struct TS
{
    int i;
    int j;
};
struct TS ts;

int main()
{
short s = 0x1122; char c = (char)s; // 0x22, // 這裡將short轉為char,發生強制型別轉換的第二種結果,產生了高位截斷 int i = (int)s; // 0x00001122 // 這裡將低型別(容量小)的型別轉為高型別,這是安全的,安全指的是資料不會錯誤也不會丟失,會將高位填充0 int j = (int)3.1415; // 3 // 這裡將浮點數值轉為整數型別,會發生第二種結果,將小數點後的所有數剔除 unsigned int p = (unsigned int
)&ts; //這裡是將ts資料結構型別取其地址值,然後轉為無符號的int,這種情況32位正常 64位截斷,32位情況下地址值是4個位元組的,而64位下地址值是8個位元組的 long l = (long)ts; // error //在C語言中不能將自定義型別轉換為基本資料型別 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; }

隱式型別轉換

  • 編譯器主動進行的型別轉換

編譯器的好意也可能辦壞事,這種默默做的事是因為程式設計師不熟悉隱式轉換規則而造成.

char c =0;
short s = c;
int i = s;
long l = i;

低型別高型別的隱式型別轉換是安全的,不會發生截斷。
高型別低型別的隱式型別轉換是不安全的,會發生截斷產生不正確的結果。

  • 什麼情況下發生隱式型別轉換呢
    • 算術運算中,低型別轉換為高型別
    • 賦值表示式中,賦值符“=”右邊的變數值轉換為左邊變數的型別
    • 函式呼叫時,實參轉換為形參的型別
    • 函式返回時,函式返回值,ruturn表示式轉換為返回值型別

安全的隱式型別轉換,反之則會發生錯誤。
安全的隱式轉換