C 型別轉換

2021-07-23 10:36:16 字數 2973 閱讀 4798

型別轉換就是將給定型別的表示式轉換為另一種型別。c++中的轉型可分為兩種:隱式型別轉換和顯式型別轉換。下面將詳細介紹這兩種轉型操作,以及各自的適用場景,潛在問題,最終將總結使用型別轉換操作應牢記的原則。

c語言中的型別轉換屬於舊式的型別轉換,其使用比較簡單,只要在待轉換的變數前加上轉換的型別即可,然後括號可以加在原變數上面,也可以加在型別名稱上面。舊式型別轉換在**中不容易分辨(無論是對人還是對程式),並且沒有做任何的安全檢查,在c++中不推薦使用。

void test1() //c語言型別轉換

講到型別轉換需要提下計算機儲存數值的方式,主要分為大端模式(big endian)和小端模式(little endian)。

計算機中基本的儲存單元乙個位元組,對應乙個位址。一些數值需要占用多個位元組,如4位元組整數int,這時該數值的每個位元組是怎麼排列的呢?

在小端模式中,數字的低位位元組放在低位址中,高位位元組放在高位址中。大端模式則相反(實際中網路協議採用大端模式傳輸資料,因此也被稱為網路位元組序)。比如說0×12345678,0×78是該數的低位位元組,0×12是該數的高位位元組。那麼在小端模式中,從低位址到高位址依次是:0×78 0×56 0×34 0×12,而在大端模式中則為:0×12 0×34 0×56 0×78。即大端模式中的數字跟我們習慣的數字順序相符合,小端模式則相反。

void test2() //大小端模式例子

c++擴充套件了c語言的型別轉換,主要分為const_cast,static_cast,dynamic_cast,reinterpret_cast四種:

const_cast,字面上理解就是去const屬性。

static_cast,命名上理解是靜態型別轉換。如int轉換成char。

dynamic_cast,命名上理解是動態型別轉換。如子類和父類之間的多型型別轉換。

reinterpret_cast,僅僅重新解釋型別,但沒有進行二進位制的轉換。

4種型別轉換的格式,如:type b = static_cast(type)(a)。

const_cast型別轉換可以去掉型別的const或volatile屬性,把const型別的指標變為非const型別的指標,從而可以修改所指向元素的值。

取出const屬性的型別轉換只有const_cast可以完成,而非const變成const可以用其他的如static_cast完成。

void test3() //測試const_cast

下面再看乙個例子,理論上應該有a=b=321,但實際上卻出現了a和b位址一樣,但內容不一樣的情況。

其實這涉及到常量摺疊的概念:編譯器進行語法分析的時候,將常量表示式計算求值,並用求得的值來替換表示式,放入常量表,可以算作一種編譯優化。在編譯器的優化的過程中,在預編譯階段會把用const修飾的變數以內容替換掉,類似於巨集替換。在執行階段時,它的記憶體裡的內容是可以改變的。

void test4() //測試常量摺疊

static_cast(靜態型別轉換),類似於c風格的強制轉換,無條件轉換。主要用於:

基本資料型別(int等)轉換,不能進行無關型別(如非父類和子類)指標之間的轉換。

基類和子類之間轉換:其中子類指標轉換成父類指標是安全的;但父類指標轉換成子類指標是不安全的。(基類和子類之間的動態型別轉換建議用dynamic_cast)

把空指標轉換成目標型別的空指標。

把任何型別的表示式轉換成void型別。

static_cast不能去掉型別的const、volitale屬性(用const_cast)。

void test5() //測試static_cast

有條件轉換,動態型別轉換,執行時型別安全檢查(轉換失敗返回null):

1. 安全的基類和子類之間轉換。

2. 必須要有虛函式。

3. 相同基類不同子類之間的交叉轉換。但結果是null。

4. dynamic_cast(動態型別轉換),用於執行時檢查該轉換是否型別安全。主要用於類層次間的上行轉換和下行轉換,以及類之間的交叉轉換,其中上行轉換可以正常進行,下行轉換和交叉轉換會進行安全處理。

該操作符只在多型型別時合法,該類至少具有乙個虛函式。因為dynamic_cast需要c++的rtti(runtime type identification,執行時型別識別)的支援。而執行時型別檢查需要執行時型別資訊,這個資訊儲存在類的虛函式表中,只有定義了虛函式的多型類才有虛函式表。

對指標進行dynamic_cast,失敗返回null,成功返回正常cast後的物件指標;

對引用進行dynamic_cast,失敗丟擲乙個異常,成功返回正常cast後的物件引用。

void test6() //測試dynamic_cast

catch (exception ex)

}

僅僅重新解釋型別,但沒有進行二進位制的轉換:

1. 轉換的型別必須是乙個指標、引用、算術型別、函式指標或者成員指標。

2. 在位元位級別上進行轉換。它可以把乙個指標轉換成乙個整數,也可以把乙個整數轉換成乙個指標(先把乙個指標轉換成乙個整數,在把該整數轉換成原型別的指標,還可以得到原先的指標值)。但不能將非32bit的例項轉成指標。

3. 最普通的用途就是在函式指標型別之間進行轉換。

4. 很難保證移植性。

reinterpret_cast執行低階轉型,實際動作結果可能取決於編譯器,一般情況下是不可移植的。

該轉換修改了運算元型別,但僅僅是重新解釋了給出的物件的位元模型而沒有進行二進位制轉換。可以將一種型別的指標轉換為另一種型別的指標,或者將整數轉換成指標,將指標轉換成整數。

其使用比較靈活,但危險度較高,實際中比較少用。

void test7() //測試reinterpret_cast

參考文獻

[2]

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