當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 關(guān)于C語言的隱式類型轉(zhuǎn)換
同種數(shù)據(jù)類型的變量在進(jìn)行運(yùn)算的時候,我們都知道怎么去運(yùn)算
比如int a = 5, b = 10;
那么a+b的結(jié)果也是int類型的;
如果是不同的數(shù)據(jù)類型的變量在進(jìn)行混合運(yùn)算的時候,就需要將其轉(zhuǎn)換成同種數(shù)據(jù)類型,然后再進(jìn)行運(yùn)算
比如:int = 5;
float b = 10.5;
a+b的結(jié)果是多少呢?
這就牽扯到了我們所說的隱式類型轉(zhuǎn)換啦,我們先來看一副圖:
從上圖中,我們可以看到,float類型轉(zhuǎn)換成了double類型的,int類型也要轉(zhuǎn)換成double的,然后才可以進(jìn)行運(yùn)算,也就是說a+b的結(jié)果就是15.5啦
我們來驗證一下:
我們看到代碼運(yùn)行的結(jié)果a+b的結(jié)果為浮點數(shù),大家可以試一下,14行代碼如果改成%d的話,編譯時就會有類型不匹配的警告,所以int類型與float類型在進(jìn)行混合運(yùn)算的時候,都轉(zhuǎn)換成了double類型。
再繼續(xù)回到圖2-3,我們可以看到圖中有兩個方向的箭頭,都分別表示什么意思呢?
同樣我們舉例說明,先來看豎向箭頭:
我們可以看到a+b的結(jié)果是大于0的,那么也就是說int類型與unsigned int類型在進(jìn)行混合運(yùn)算的時候,先轉(zhuǎn)換為unsigned int類型,然后再進(jìn)行運(yùn)算。
同樣,我們再來看一個橫向箭頭的例子:
可以發(fā)現(xiàn),sizeof(a+b)的結(jié)果為4,如果a+b還是char類型的話,結(jié)果應(yīng)該是1,我們結(jié)合圖2-3,也就是說char類型在進(jìn)行運(yùn)算的時候,勢必要向int類型轉(zhuǎn)換,不管有沒有進(jìn)行混合運(yùn)算。
再來看一個例子:
打印的結(jié)果為a + b <= 0,結(jié)合圖2-3,我們可以推斷出char類型與unsigned char在進(jìn)行運(yùn)算時,都轉(zhuǎn)換成了int類型,同樣,如果將char改成short,unsigned char改成unsigned short,結(jié)果也是a + b <= 0,那就說明了short與unsigned short在進(jìn)行運(yùn)算時,也都轉(zhuǎn)換成了int。
所以:我們可以總結(jié)出,豎向箭頭表示不同的數(shù)據(jù)類型在進(jìn)行混合運(yùn)算的時候,會有一個低字節(jié)向高字節(jié)轉(zhuǎn)換的過程,橫向箭頭表示不管該類型有沒有進(jìn)行混合運(yùn)算都勢必會進(jìn)行轉(zhuǎn)換,再進(jìn)行運(yùn)算,但是需要注意:比如int類型與double類型進(jìn)行運(yùn)算,不是int->unsigned->long->double這么一個過程,而是int類型會直接轉(zhuǎn)換成double類型。
后,再強(qiáng)調(diào)一點,我們說int與double類型運(yùn)算時,int會轉(zhuǎn)換成double,如下圖:
我們可以看出,在編譯時,出現(xiàn)了警告,說明實際上a的類型實質(zhì)上并沒有轉(zhuǎn)換成double類型的,而只是在運(yùn)算的過程中發(fā)生了轉(zhuǎn)換。