C語言進階學習1 隱式型別轉換和強制型別轉換
阿新 • • 發佈:2019-01-01
本部落格記錄狄泰學院課程的學習
學習交流群: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表示式轉換為返回值型別
安全的隱式型別轉換,反之則會發生錯誤。