天天看點

C/C++ 回顧總結之隐式類型轉換

隐式類型轉換

隐式類型轉換是指由編譯器程式按照某種預定的規則進行自動轉換。對于不同的操作,隐式轉換規則會有所不同。下面針對不同種類的操作符分别介紹它們的隐式轉換規則。

(1)       算術操作的類型轉換

1)         如果其中一個操作數類型為long double,則另一個操作數也轉換成long double。

2)         如果其中一個操作數類型為double,則另一個操作數也轉換成double。

3)         如果其中一個操作數為float,則另一個數轉換成float類型。

4)         先對操作數進行整型提升轉換,如果操作數的類型不一樣,則按5)以後的規則再進行轉換。整形提升轉換規則是:

                         i.              對于char,signed char,unsigned char,short int,unsigned short int類型,如果int型能夠表示它們的值,則這些類型轉成int,否則這些類型轉換成unsigned int。

                       ii.              Bool類型轉換成int型,false為0;true為1.

                      iii.              wchar_t和枚舉類型轉換成下列類型中第一個能表示其所有值的類型:int,unsigned int,long int,unsigned long int。

5)         如果其中一個操作數類型為unsigned long int,則另一個操作數轉換成unsigned long int 類型。

6)         如果一個操作數為long int,另一個操作數類型為unsigned int,那麼如果long int能表示unsigned int的所有值,則unsigned int轉換成long int,否則兩個操作數都轉化成unsigned long int類型。

7)         如果一個操作數為long int,則另一個操作數轉換成long int類型。

8)         如果一個操作數類型為unsigned int,則另一個操作數轉換成unsigned int類型。

(在上述的轉換規則中,如果8)仍不滿足,則根據4)的整形提升規則可知,兩個操作數都已是int型了)

同時需要注意的是,把位數少的有符号整型轉換成位數多的有符号整型是,需要在高位擴充符号位。另外把有符号整型轉換成相應的(位數相同的)無符号整型時,不會改變有符号資料的值,隻是把它在記憶體中的二進制位按照無符号整數來解釋,這時可能會導緻錯誤。

(2)       關系操作的類型轉換

對于關系操作符,當操作數是算術類型和枚舉類型時,編譯程式将按常量算術轉換規則對它們進行轉換。

(3)       邏輯操作的類型轉換

對于邏輯操作符,C++允許對算術類型、枚舉類型和指針類型資料進行邏輯操作,但在操作前需要對它們進行邏輯類型轉換。邏輯類型轉換的規則是:對于算術型和枚舉型,零轉成false,非零轉成true;對于指針型,空指針轉成false,非空指針轉成true。

(4)       位操作的類型轉換

對于邏輯位操作,編譯程式将會按照正常算術轉換規則對操作數進行類型轉換,運算結果的類型與轉換後的操作數類型相同。

對于移位操作,編譯程式會對操作數按整型提升規則進行類型轉換,運算結果的類型與第一個操作數類型(進行類型轉換之後)相同。

(5)       指派操作符的類型轉換

對于指派操作,當指派操作的兩個操作數類型不同時,編譯程式将按指派轉換規則進行隐式類型轉換,即把右邊操作數轉換成左邊的操作數類型。在C++中,各種算術類型之間可以進行類型轉換,其中,将實話類型轉換成整型時,小數部分将舍去,并且不進行“四舍五入”。

(6)       條件操作符的類型轉換

對于條件操作符,第一個操作數也可以是算術型、枚舉型以及指針類型,編譯程式對其進行邏輯轉換:0轉成false;非0轉成true。第二,三個操作數可以是任意類型,當它們的類型不同時,編譯程式将對它們進行類型轉換。其中,對于算術類型和枚舉類型,編譯程式将按正常算術轉換規則進行轉換。條件操作的結果類型為轉換之後的第二、三個操作數類型。