[基礎(chǔ)]C++:類型轉(zhuǎn)換

我們常常將不同類型的數(shù)據(jù)相互轉(zhuǎn)換,但也常常發(fā)生錯(cuò)誤。當(dāng)然可以由編譯器來幫忙檢查。但是,我們認(rèn)為的一些數(shù)據(jù)類型轉(zhuǎn)換的錯(cuò)誤在C++里有可能完全合法。從而編譯器沒法檢查出來。下面看這樣一段代碼:

#include<iostream>
using namespace std;
int main()
{
    bool b = 42; //b為真
    int i = b; //i的值為1
    i = 3.14; //i的值為3
    double pi = i; //pi的值為3.0
    unsigned char c = -1; //書上說是255
    signed char c2 = 256; //未定義
    cout << b << endl;
    system("pause");
    return 0;
}

你會(huì)發(fā)現(xiàn)編譯器全通過了,讓我們看看具體是怎么轉(zhuǎn)換的:

  • 當(dāng)我們把一個(gè)非bool類型賦給bool時(shí),0代表false,其余結(jié)果為true。
  • 當(dāng)我們把一個(gè)bool賦給非bool時(shí),false對(duì)應(yīng)的結(jié)果為0,true對(duì)應(yīng)的結(jié)果為1
  • 當(dāng)我們把一個(gè)非int類型賦值給int時(shí),結(jié)果保留整數(shù)部分。
  • 當(dāng)我們把非doudle類型賦值給doudle類型時(shí),小數(shù)部分為0。
  • 當(dāng)我們賦給無符號(hào)類型一個(gè)超過它范圍的值時(shí)。結(jié)果為對(duì)無符號(hào)類型范圍取模后的余數(shù)。
  • 當(dāng)賦給帶符號(hào)類型一個(gè)超過它表示范圍的值時(shí),結(jié)果為未定義。很可能讓程序崩潰。

含有無符號(hào)類型和有符號(hào)類型同時(shí)運(yùn)算

當(dāng)一個(gè)算數(shù)表達(dá)式既有無符號(hào)又有int值時(shí),int將先轉(zhuǎn)換為無符號(hào)類型。然后在進(jìn)行運(yùn)算。

#include <iostream>
using namespace std;
 
int main()
{
    int i = -42;
    unsigned u = 10;
    cout << i + i << endl; //輸出 -84
    cout << i + u << endl; //輸出 4294967264
    system("pause");
    return 0;
}

你會(huì)發(fā)現(xiàn)i+u變成了一個(gè)很可怕的數(shù)。讓我們看看具體怎么得到這個(gè)可怕的數(shù):

  • int為32位,范圍為2^32=4294967296。
  • 根據(jù)取模的定義(-42+4294967296)%4294967296=4294967254。
  • 4294967254+10=4294967264。

結(jié)論

當(dāng)賦給無符號(hào)負(fù)數(shù)時(shí)就進(jìn)行取模運(yùn)算。

參考:C++primer 第五版

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容