C語言視頻 VS2015:[13]類型轉換

Visual Studio 2015的發布,跟隨而來的相關的教程的空白,這裡講逐步在Visual Studio 2015上講解C語言相關的系列視頻教程經驗(註:由於視頻修改難度大,所以先暫時發布文檔,視頻後期逐步補上),本文主要涉及:

① 隱式類型轉換原則;

② 隱式類型轉換舉證,主要是利用利用計算機的警告,讓計算機自己來告訴我們當前的數據類型;

③ 特殊的int類型隱式類型轉換;

④ 顯式類型轉換;

工具/原料

Visual Studio 2015
Windows 8.1 x64

隱式類型轉換原則

無論是前面講的算術運算符,還將後面要講解的關係運算符,對於這些二目運算符,在進行開發的過程中,經常會遇到不同類型的操作數混合運算的情況,那麼對於這些不同類型的操作數進行混合運算,編譯器是如何處理這些不同的類型的呢?

註:二目運算符主要是真需要兩個操作數的運算符,如加法,需要兩個加數才能夠進行,減法也需要兩個加數才能夠進行等;

在C語言裡面,隱式類型轉換具有以下的原則:

① 當操作數中有一個是long doule類型的時候,另一個操作數將被轉換成long double類型;

② 如果上面的條件沒有成立,當操作數中一個是double類型的時候,另一個操作數將被轉換成double類型;

③ 如果上面兩個條件都沒有成立,當操作數中一個是float類型的時候,另一個操作數將被轉換成float類型;

④ 如果上面的三個條件都沒有成立,那麼整數類型的轉換將遵循下面的原則:

a. 當操作數中一個是unsigned long long 類型的時候,另一個操作數將被轉換成unsigned long long類型;

b. 如果上面的條件沒有成立,如果一個操作數是long long,另一個操作數將被轉換成long long類型;

c. 如果上面的2個條件沒有成立,如果一個操作數是unsigned long,另一個操作數將被轉換成unsigned long類型;

d. 如果上面的3個條件沒有成立,如果一個操作數是long,另一個操作數是 unsigned int類型,所有的操作數都將被轉換成 unsigned long;

e. 如果上面的4個條件沒有成立,如果一個操作數是long,另一個操作數將被轉換成long類型;

f. 如果上面的5個條件沒有成立,如果一個操作數是unsigned int,另一個操作數將被轉換成unsigned int類型;

g.如果上面的條件都不成立,所有的操作數都將被轉換成 int 類型;

總結一下便是:

① 當操作數中一個是「整數」,另一個是「小數」時,整數將轉換成小數;

② 操作數中位數低於int類型的位數的,操作數將都被轉換成int類型;

③ 當操作數中出現「類型位數少的」和「類型位數多的」時,類型位數少的將轉換成類型位數多的,

④ 當操作數中出現「有符號類型」和「無符號類型」時,有「符號的類型」將被轉換成「無符號類型」;

隱式類型轉換舉證

小數」與「小數」運算的情況:

註:為了證明上述的類型轉換是成立的,我們需要利用系統的警告來告訴我們答案,所以例子的結果都採用char類型來接收,以便系統可以產生警告;

通過對比源碼和警告信息,我們可以發現:

① long double 類型 和 double 類型 運算,結果轉換成了long double;

② long double 類型 和 float 類型 運算,結果轉換成了long double;

③ double 類型 和 float類型 運算,結果轉換成了double;

轉換符合C語言裡面的隱式類型轉換原則;

"整數"與「整數」運算的情況:

通過警告信息,我們發現發現:

前 5 轉換符合了C語言裡面的類型自動轉換原則,

但是後面的 5 個似乎並不符合C語言的類型自動轉換原則?

這主要是由於C語言裡面,int 和 unsigned int 類型的特殊性導致的,int 和 unsigned int 類型,在C語言裡面可以自由的轉換成任意類型,而不會產生警告信息導致的?那後面的五種情況如何證明呢?

int 或 unsigned int 類型雖然可以自由轉換成其他的數據類型,但是並能夠隨便的轉換成指針類型,所以修改下面的和的類型為指針類型,編譯後,警告出來了:

通過警告信息,我們發現發現:

後 5 轉換符合了C語言裡面的隱式類型轉換原則,

整數」和「小數」的情況:

通過警告信息,我們發現發現:

所有的轉換符合了C語言裡面的隱式類型轉換原則,

int類型隱式轉換

其實在「隱式類型轉換舉證」部分我們就已經知道了,int類型在c語言裡面具有其特殊性,int類型轉換原則:

int 或 unsigned int 類型可以隱式的轉換成其他的整數類型,而不會產生警告;

具體的例子如下所示:

有了上面的例子,我們就可以理解了為什麼整數初始化的時候,不帶後綴而不會產生警告了,如:

char 類型的後綴是 i8,short 類型的後綴是 i16,等,具體的可以看:

https://jingyan.baidu.com/article/fedf07375bb95c35ad89777c.html

這是由於系統的整數的默認類型就是 int 類型,具體的如下圖警告所示:

顯式類型轉換

顯示轉換又稱為強制類型轉換,操作比較的直接,直接在需要轉換的操作數前面加上「(目標類型)」,就可以進行,但是需要注意的是不同類型的轉換

通過錯誤窗口可以觀察到:

① 沒有加強制類型轉換的第5行,產生了警告,

② 加了強制類型轉換「(int)」後的第6行,沒有產生警告;

通過監視窗口可以觀察到:

類型轉換後,int類型只保留了double類型的整數部分,小數部分都被截斷掉了

方便他人亦是方便自己,如果覺得還行就點下下邊投票吧,這樣可以幫助其他人更快的找到解決問題的方法;有疑問的也可留言哦, 謝謝!

原作者:付科

本文內容整理自網絡, 文中所有觀點看法不代表淘大白的立場