c++自動執行很多態別轉換:
1. 初始化和賦值進行的轉換
c++允許將一種型別的值賦給另一種型別變數。這樣做時,值將被轉換為接收變數的型別。
例如,假設so_long的型別為long,thirty的型別為short,而程式中包含這樣的語句:
so_long = thirty; //assigning a short to along
則進行賦值時,程式將thirty的值(通常為16位)擴充套件為long值(通常為32位)。擴充套件後將得到乙個新值,這個值被儲存在so_long中,而thirty的內容不變。
將乙個值賦給值取值更大的型別通常不會導致什麼問題。例如,將short值賦給long變數並不會改變這個值,只是占用的位元組更多而已。然而,將乙個很大的long值(如2111222333)賦給float變數將降低精度。因為float只有6位有效數字,因此這個值被四捨五入為2.11122e9。因此,有些轉換是安全的,有些則會帶來麻煩。如下表,列出了一些可能出現的轉換問題。
潛在的數值轉換問題 轉換
潛在的問題
將較大的浮點型別轉換為較小的浮點型別,如將double轉換為float
精度(有效位)降低,值可能超出目標型別的取值範圍,在這種情況下,結果將不確定
將浮點型別轉換為整型
小數部分丟失,原來的值可能超出目標型別的取值範圍,在這種情況下,結果將不確定
將較大的整型轉換為較小的整型,如將long轉換為short
原來的值可能超出目標型別的取值範圍,通常只複製右邊的位元組
將0賦給bool變數時,將被轉換為false;而非零值將被轉換為true。
將浮點型賦給整型將導致兩個問題。首先,將浮點值轉換為整型會將數字截短(除掉小數部分)。其次,float值對int變數來說可能太大了。如下**:
int guess(3.9832); //double converted to int
int debt = 7.2e12; //result not define in c++
輸出為:
guess = 3
debt = 1634811904
對於debt變數,不同編譯器顯示的值也可能不同。
2. 以{}方式初始化時進行的轉換(c++11)
c++11將使用大括號的初始化稱為列表初始化,因為這種初始化常用於給複雜的資料型別提供值列表。列表初始化不允許縮窄(narrowing),即變數的型別可能無法表示賦給它的值。
const int code = 66;
int x = 66;
char c1; //narrowing,not allowed
char c2 = ; //allowed because char can hold 66
char c3 ; //ditto
char c4= ; //not allowed,x is not constant
x = 31325;
char c5 = x; //allowed by this form of initialization
在上述**中,初始化c4時,知道x的值為66,但在編譯器看來,x是乙個變數,其值可能很大。編譯器不會跟蹤下述階段可能發生的情況:從x被初始化到它被用來初始化c4。
3. 表示式轉換
當同乙個表示式中包含兩種不同的算術型別時,c++將執行兩種自動轉換:首先,一些型別在出現時便會自動轉換;其次,有些型別在與其他型別同時出現在表示式中時將被轉換。
在計算表示式時,c++將bool、char、unsigned char、signed char和short值轉換為int。具體說,ture被轉換為1,false被轉換為0。這些轉換被稱為整型提公升。
當運算涉及兩種型別時,較小的型別將被轉換為較大的型別。以下是c++11版本的校驗表,編譯器將依次查閱該錶。
(1)如果有乙個運算元的型別是long double,則將另乙個運算元轉換為long double。
(2)否則,如果有乙個運算元的型別是double,則將另乙個運算元轉換為double。
(3)否則,如果有乙個運算元的型別是float,則將另乙個運算元轉換為float。
(4)否則,說明運算元都是整型,因此執行整數提公升,
(5)在這種情況下,如果兩個運算元都是有符號或無符號的,且其中乙個運算元的級別比另乙個低,則轉換為級別高的型別。
(6)如果乙個運算元為有符號的,另乙個運算元為無符號的,且無符號運算元的級別比有符號運算元高,則將有符號運算元轉換為無符號運算元所屬的型別。
(7)否則,如果有符號型別可表示無符號的所有可能取值,則將無符號運算元轉換為有符號運算元所屬的型別。
(8)否則,將兩個運算元都轉換為有符號型別的無符號版本。
4. 強制型別轉換
強制型別轉換的通用格式如下:
(typename) value //converts value to typename type
typename (value) //converts value to typename type
注:本文是本人學習《c++ primer plus》的筆記。 mysql型別轉換c 型別轉換 C 型別轉換
一 簡介 型別轉換 把資料從一種型別轉換另一種型別 我們要求等號兩邊參與運算子必須型別一致,如果不一致,滿足下列條件會發生自動型別轉換或者隱式型別轉換。1.兩種型別相容 例如 int和double 相容 都是數字型別 2.目標型別大於源型別 double int 顯示型別轉換 1.兩種型別相相容 i...
C 型別轉換
在程式中,進行型別轉換是常見的事。那麼在 c 中支援以前語言的型別轉換方法,即用型別名進行強行轉換,例如 object objtest new newtype newtype newvalue newtype objtest 但是這樣轉換,有個嚴重的問題,就是在把 objtest 強轉換成 newt...
C 型別轉換
型別轉換是將一種型別的值對映為另一種型別的值。型別轉換實際上包含有自動隱含和強制的兩種。型別的自動隱式轉換 c 語言編譯系統提供的內部資料型別的自動隱式轉換規則如下 1.程式在執行算術運算時,低型別可以轉換為高型別。2.在賦值表示式中,右邊表示式的值自動隱式轉換為左邊變數的型別,並賦值給它。3.當在...