型別轉換
1.1 強制型別轉換
語法:C中在變數名或具體數值前使用()表示進行強制型別轉換;
(Type) Expression
Type(Expression)
注:
- 當目標型別能夠容納目標值時,結果不變;
- 當目標型別不能容納目標值時,結果產生截斷;
- 不是所有的強制型別轉換都能成功,例如自定義型別與基本型別進行轉換;編譯器將報錯
1 #include <stdio.h> 2 3 struct TS 4 { 5int i; 6int j; 7 }; 8 9 struct TS ts; 10 11 int main() 12 { 13short s = 0x1122; 14charc = (char)s; 15inti = (int )s; 16intj = (int)3.14; 17unsigned int p = (unsigned int)&ts;//32位正常 64位截斷 18longl = (long)ts; 19ts= (struct TS)l; 20 21printf("s = %x\n", s); 22printf("c = %x\n", c); 23printf("i = %x\n", i); 24printf("j = %x\n", j); 25printf("p = %x\n", p); 26printf("&ts = %p\n", &ts); 27 28return 0; 29 }
1.2 隱式型別轉換
編譯器主動進行的型別轉換即隱式型別轉換;
稱某型別在記憶體中所佔用的位元組數少為型別。則相應的,低型別向高型別的隱式型別轉換時安全的,相反地,則型別轉換將產生不正確的結果;
發生時機:
- 算術運算式:低型別轉換為高型別
- 賦值表示式,表示式的值轉換為左邊變數型別的值
- 函式呼叫,實參轉換為形參的型別;
- 函式返回值,return表示式轉換為返回值型別
1 #include <stdio.h> 2 3 int main() 4 { 5charc = 'a'; 6inti = c; 7unsigned int j = 0x11223344; 8shorts = j; 9 10printf("c = %c\n", c); 11printf("i = %d\n", i); 12printf("j = %x\n", j); 13printf("s = %x\n", s); 14printf("sizeof(c + s) = %d\n", sizeof(c + s));//char → int shor → int sizeof(int+int) = int; 15 16return 0; 17 }
1.3安全的隱式型別轉換
char/short → int → unsigned int → long → unsigned long → float → double
char → short
1.4 C++中的型別轉換
如1.1中所示,C語言中強制型別轉換在任意型別之間都可以進行轉換,編譯器很難判斷正確性,C++中的強制型別轉換分為4種不同型別:
1.4.1 static_cast
用於基本型別間 轉換
不能用於基本型別指標間 的轉換
用於有繼承關係類物件 之間的轉換和類指標 之間的轉換
1 #include<stdio.h> 2 3 int main() 4 { 5int i = 0x12345; 6char c = 'c'; 7int* pi = &i; 8char* pc = &c; 9 10c = static_cast<char>(i); 11pc= static_cast<char*>(pi); //error 12 13return 0; 14 }
1.4.2 const_cast
用於去除變數的只讀屬性
強制型別轉換的目標型別必須是指標或引用
1 #include<stdio.h> 2 3 int main() 4 { 5const int& j = 1; 6int& k = const_cast<int&>(j);//k = 1 7 8const int x = 2;//x = 2常量 9 10int& y = const_cast<int&>(x);//y = 2 11int z = const_cast<int>(x);//error 12 13k = 5; 14 15printf("k = %d\n", k);//k=5 16printf("j = %d\n", j);//j=5 17 18y = 8; 19 20printf("x = %d\n", x);//x = 2 21printf("y = %d\n", y);//y = 8 22printf("&x = %p\n", &x); 23printf("&y = %p\n", &y); 24 25return 0; 26 }
1.4.3 reinterpret_cast
用於指標型別間的 強制轉換
用於整數和指標型別間的強制轉換(嵌入式程式碼)
1 #include<stdio.h> 2 3 int main() 4 { 5int i = 0; 6char c = 'c'; 7int* pi = &i; 8char* pc = &c; 9 10pc = reinterpret_cast<char*>(pi); 11pi = reinterpret_cast<int*>(pc); 12pi = reinterpret_cast<int*>(i); 13c = reinterpret_cast<char>(i); //error 14 15return 0; 16 }
1.4.4 dynamic_cast
用於有繼承關係的類指標 間的轉換
用於有交叉關係的類指標 間的轉換
具有型別檢查的功能(若轉換不成功反饋NULL)
需要虛擬函式的支援
1 #include<stdio.h> 2 3 int main() 4 5 { 6 7int i = 0; 8int pi = &i; 9 10char* pc = dynamic_cast<char*>(pi); //error 11 12return 0; 13 }