C 型別轉換

2021-09-24 22:14:45 字數 2613 閱讀 4657

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.當在...