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