【轉】C語言隱式類型轉換規則

C語言規定,不一樣類型的數據須要轉換成同一類型後纔可進行計算,在整型、實型和字符型數據之間經過類型轉換即可以進行混合運算(但不是全部類型之間均可以進行轉換)ide

.當混合不一樣類型的變量進行計算時,即可能會發生類型轉換函數

相同類型的數據在轉換時有規則可循:對象

字符必須先轉換爲整數(C語言規定字符類型數據和整型數據之間能夠通用)get

short型轉換爲int型(同屬於整型)編譯器

float型數據在運算時一概轉換爲雙精度(double)型,以提升運算精度(同屬於實型)博客

賦值時,一概是右部值轉換爲左部類型it

[注]io

當整型數據和雙精度數據進行運算時,C先將整型數據轉換成雙精度型數據,再進行運算,結果爲雙精度類型數據編譯

當字符型數據和實型數據進行運算時,C先將字符型數據轉換成實型數據,而後進行計算,結果爲實型數據class

2.4 數據類型轉換在C語言的表達式中,准許對不一樣類型的數值型數據進行某一操做或混合運算。當不一樣類型的數據進行操做時,應當首先將其轉換成相同的數據類型,而後進行操做。數據類型轉換有兩種形式,即隱式類型轉換和顯示類型轉換。

2.4.1 隱式類型轉換所謂隱式類型轉換就是在編譯時由編譯程序按照必定規則自動完成,而不需人爲干預。所以,在表達式中若是有不一樣類型的數據參與同一運算時,編譯器就在編譯時自動按照規定的規則將其轉換爲相同的數據類型。

C語言規定的轉換規則是由低級向高級轉換。例如,若是一個操做符帶有兩個類型不一樣的操做數時,那麼在操做以前行先將較低的類型轉換爲較高的類型,而後進行運算,運算結果是較高的類型。更確切地說,對於每個算術運算符,則遵循圖2-2所示的規則。

C語言隱式類型轉換規則 - vigi - VIGI的博客

圖2-2 數據類型轉換規則之一

注意:在表達式中,全部的float類型都轉換爲double型以提升運算精度。

在賦值語句中,若是賦值號左右兩端的類型不一樣,則將賦值號右邊的值轉換爲賦值號左邊的類型,其結果類型仍是左邊類型。

由於函數參數是表達式,所以,當參數傳遞給函數時,也發生類型轉換。具體地說,char和short均轉換爲int;float轉換爲double。這就是爲何咱們把函數參數說明爲int和double,儘管調用函數時用char和float .

也能夠將圖2-2所示的規則用圖2-3表示。圖2-3中的水平箭頭表示一定轉換,縱向箭頭表示兩個操做對象類型不一樣時的轉換方向。

C語言隱式類型轉換規則 - vigi - VIGI的博客

圖2-3 數據類型轉換規則之二

下面舉行說明類型轉換的規則。例如執行:

x=100+'a'+1.5 * u+f/'b'-s * 3.1415926

其中,u爲unsigned型,f爲float型,s爲short型,x爲float型。式中右面表達式按以下步驟處理:

(1)首先將'a'、'b'和s換成int,將1.5和f轉換爲double型。

(2)計算100+'a',因'a'已轉換爲int型,因而此運算結果爲197。

(3)計算1.5*u,因爲1.5已轉換爲double,u是unsigned型,因而首先u轉換爲double,而後進行運算,運算結果爲double。

(4)計算197+1.5 * u,先將197轉換爲double(如197.00…00),其結果爲double。

(5)計算f/ 'b',f已轉換爲double,'b'已轉換爲int,因而先將'b'再轉換爲double,其結果爲double。

(6)計算(197+1.5 * u)+f / 'b',者均爲double,因而結果也爲double。

(7)計算s * 3.1415926,先將s由int轉換爲double,而後進行運算,其結果爲double。

(8)最後與前面得的結果相減,結果爲double。

(9)最後將表達式的結果轉換爲float並賦給x。

 

先看程序:

#include<stdio.h>

#include<stdlib.h>

int main(int argc, char**argv){

unsigned int right = 1;

char left = -1;

if(left < right)printf("%d < %d\n", left, right);

else if(left == right)printf("%d = %d\n", left, right);

else printf("%d > %d\n", left, right);

system("PAUSE");

return 0;

}

運行結果是:-1 > 1

解釋:按步驟進行.

1. 若是其中一個操做數爲long double類型,則另外一個操做數被轉換爲long double.

2. 不然,若是其中一個操做數爲double, 則另外一個操做數被轉換爲double.

3. 不然,若是其中一個操做數爲float, 則另外一個操做數也轉換爲float.

4. 不然,兩個操做數進行 "整型升級":

a. 若是其中一個操做數爲unsigned long int, 則另外一個操做數也被視爲unsigned long int.

b. 不然,若是其中一個操做數爲long int,而另外一個操做數類型是unsigned int, 而且long int可以表示unsigned int的全部值,則另外一個操做數也被視爲long int;若是long int不能表示unsigned int的全部值,則兩個數都被視爲unsigned long int.

c. 不然, 若是其中一個操做數是long int,則另外一個操做數也被視爲long int.

d. 不然, 若是其中一個操做數是unsigned int, 則另外一個操做數也被視爲unsigned int.

e. 不然, 兩個操做數都被視爲int.

相關文章
相關標籤/搜索