C 學習筆記 07 型別轉換

2021-09-30 11:07:56 字數 2733 閱讀 7330

型別轉換

【賦值轉換】

賦值轉換指的是將一種型別的值賦給另一種型別的變數,這時,值將會轉換為接收變數的型別,如語句:

a=b;

如果a是long型,b是short型,則程式會將16位(short佔兩位元組)的b提公升為32位(long佔4位元組),並賦給a,直觀上講,型別的表達能力取決於該型別所佔的記憶體位數,從表達能力低的型別轉換為表達能力高的型別,即進行位元組的擴充通常不會帶來什麼弊端,將short型值賦值給long型變數並不會改變這個值,只是占用的位元組多了而已,但其他一些情況下可能會出現一些轉換問題。

(1)      

將較大的整型(表達能力強)轉換為較小的整型

**示例:

執行結果:

可見只有低位的兩個位元組

0x5678

賦值了給變數

y,高位的

0x1234

被捨棄了。

(2)      

浮點型轉換為整型

**示例:

執行結果:

c++採取的是「擷取」,而不是四捨五入的方法,當浮點數的值過大時,整型的值就會不確定,在不同的系統會有不同的結果。

(3)      

較大的浮點型轉換為較小的浮點型

**示例:

執行結果:

較大的浮點數的值超過目標浮點型的表示範圍,將會得到乙個不確定的結果

(4)整型轉換為浮點型

**示例:

執行結果:

可見,y的實際值為123457000,這可能會給運算帶來很大的誤差。

(5)對

bool

型別進行賦值

將0賦值給bool變數時,會被轉換為false;

而非0的值賦給bool變數時,就會被轉換為true;

【表示式中的轉換】

當同乙個表示式**現不同型別的量時,c++會根據不同的情況對運算元進行自動轉換,這些轉換可分為「整型提公升」(integral promotion)和「運算時的轉換」兩類。

(1)整型提公升

在 表 達 式 計 算 中 , c++將 bool、 char、unsigned  char、 signed char、short和signed short型值都會自動轉換成int型,對bool型別而言,true轉換為1,false則轉換為0。

注意:unsigned short向int的轉換比較特殊:如果系統中int佔4位元組,這unsignedchar會轉換成int ,但若系統中int 佔兩位元組(即int 和short 同樣長度),則unsigned short會轉換成unsigned int,這就避免了資料的丟失。

(2)運算時的轉換

當運算涉及到兩種型別時,較小的型別將會被轉換成較大的型別,換言之,表達力低的型別將會被轉換成表達力高的型別。各型別表達能力從低到高排列為:

int(等價於signedint)→ unsigned int →long(等價與signed long)→unsigned long → float→double→long double

【強制型別轉換】

c++引入了強制型別轉換機制來顯式地進行型別轉換,強制型別轉換的格式有兩種,舉例來說,為了將double型變數x轉換為long型,可使用下列語句中的任意乙個:

(long) x;

long (x);

第一種格式,即「(型別名)值」這種寫法是c語言的用法,而第二種格式,即「型別名(值)」是純粹的c++用法,這樣,型別名等價於乙個函式,而要轉換的值等價於該函式的引數,函式返回值即是目的型別值。

注意:不論是強制型別轉換,還是隱式的賦值轉換和表示式中的轉換,都不會改變變數的值,而是建立乙個新的、指定型別的值,因此,不僅僅可對變數進行型別轉換,對常量的顯式轉換也是合法的,如:

int(3.14);

float(3.1415926535897);

在顯式型別轉換中,應該特別注意從較高階別的型別轉換為較低級別型別時,容易引起資料丟失。

**示例:

執行結果:

**中,unsigned char型別在記憶體中是只占用乙個位元組的,表達範圍從0到255之間,對於「300」只能擷取處理,只保留低位元組,故返回值是44。

C 高階 07 型別轉換

型別轉換就目前 get 到的在 c 裡面一共有兩種,隱式轉換跟顯式轉換 也叫強勢轉換 下面咱們乙個乙個的以 例項來介紹。1,隱式轉換 參與運算 算術運算和賦值運算 的運算元和結果型別必須一致,當不一致時,滿足下面條件時系統自動完成型別轉換 隱式轉換 1 兩種型別相容 例如 int 和 double ...

C 學習筆記13 型別轉換

const cast 運算子用於修改型別的 const volatile 屬性。除了 const 或 volatile 屬性之外,目標型別必須與源型別相同。這種型別的轉換主要是用來操作所傳物件的 const 屬性,可以加上 const 屬性,也可以去掉 const 屬性。class a void f...

C 筆記5型別轉換

以下 的開頭 include using namespace std c 型別轉換 原始型別轉換,所有情況都是一種寫法,可讀性不高,有可能有潛在的風險 void func int type case 2 default void func2 char c p void main void func ...