C語言進階剖析 04 型別轉換
阿新 • • 發佈:2019-01-09
型別之間的轉換
- 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編譯器的型別檢查是比較寬鬆的,因此隱式型別轉換可能帶來意外的錯誤。
內容參考狄泰軟體學院系列課程,如有侵權,請聯絡作者刪除!感謝~