C語言資料型別轉換

2021-10-03 11:51:29 字數 2614 閱讀 8220

二、強制型別轉換

三、課後作業

計算機進行算術運算時,要求各運算元的型別具有相同的大小(儲存位數)及儲存方式,不能將char 型( 1 位元組)資料與 int 型(2、4或8位元組)資料直接參與運算;由於儲存方式的不同,也不能將 int 型資料與 double 型資料直接參與運算。

然而,由於 c語言的靈活性,在乙個表示式或一條語句中,允許不同型別的資料混合運算。

c語言的靈活性與計算機的機械性是一對矛盾,如處理不好,將會產生錯誤結果。對於某些型別的轉換編譯器可隱式地自動進行,不需程式設計師干預,稱這種轉換為自動型別轉換;而有些型別轉換需要程式設計師顯式指定,這種型別轉換稱為強制型別轉換

乙個表示式**現不同型別間的混合運算,較低型別將自動向較高型別轉換。

不同資料型別之間的差別在於資料的取值範圍和精度上,一般情況下,資料的取值範圍越大、精度越高,其型別也越「高階」。

整型型別級別從低到高依次為:

signed char->unsigned char->short->unsigned short->int->unsigned int->long->unsigned long

浮點型級別從低到高依次為:

float->double

float浮點型別被我們棄用了,所以不提它了。

當 char、unsigned char、short 或 unsigned short出現在表示式中參與運算時,一般將其自動轉換為 int 型別。

int 與 unsigned int混合運算時,int自動轉換為unsigned int型。

int、unsigned int 與 long 混合運算時,均轉換為 long 型別。

當運算元中含有浮點型資料時,所有運算元都將轉換為 double 型。

例如:

int ii=

100;

double dd=

200.5

;ii+dd;

上述算術表示式中運算元 dd 為double,所以先把ii轉換為double浮點數後再參與運算,運算結果為雙精度浮點數300.5。

當賦值運算子的右值(可能為常量、變數或表示式)型別與左值型別不一致時,將右值型別提公升/降低為左值型別。例如:

double dd;

dd=10

;// 右值為雙精度,左值為整數

由於左值dd為雙精度浮點型,所以先把右值整型常量10 提公升為雙精度浮點型後,再賦值給dd,不但不丟失精度反而提高了精度。

int ii;

ii=10.5

;// 右值10.5為雙精度,左值為整型

右值雙精度型 10.5 降低為左值整型,即10.5捨棄小數部分後,把10 賦給整型變數ii,這種情況會丟失精度。

更糟糕的情況是,賦值運算子右值的範圍超出了左值型別的表示範圍,將把該右值截斷後,賦給左值。所得結果可能毫無意義。例如:

char c;

// char佔8位,取值範圍是-128-127。

c=1025

;// 整數1025 對應二進位制形式是100 0000 0001,超出了8位。

printf

("%d"

,c);

// 以十進位制輸出c的值

該輸出結果為 1,因為只取 1025 低 8 位 0000 0001(值為1),賦給字元型變數c,得到毫無意義的值。

雖然自動型別轉換不需要人工干預,使用方便,但有利也有弊,尤其當自動型別轉換是從較高型別轉換為較低型別時,將會降低精度或截斷資料,可能得不到預期的結果。

為了給程式設計人員提供更多的型別轉換控制許可權,使程式設計更加靈活,轉換的目的更加清晰,c語言提供了可顯式指定型別轉換的語法,通常稱之為強制型別轉換。

強制型別轉換的格式為:

(目標型別) 表示式;
例如:

int a,b;a=4

;b=3;

double dd;

dd=a/b;

// dd的結果將是1。

dd=(

double

)(a/b)

;// dd的結果是1.000000。

dd=(

double

)a/b;

// dd的結果是1.333333

dd=a/b,dd的結果是1,這個很好理解,因為整數除整數還是整數,沒有小數部分。

dd=(double)(a/b),dd的結果也是1.000000,這個不好理解,它的運算過程是:

(1)先運算a/b,得到的結果是整數的1;

(2)把整數的1轉換成double,是1.000000。

dd=(double)a/b,dd的結果是1.333333,這個也不好理解,它的運算過程是:

(1)先執行(double)a,把a轉換為double,即4.000000;

(2)把4.00000除以3,得到1.333333,符合自動型別轉換的規則。

這裡還有個問題,程式設計師搞不清楚是(double)a優先還是a/b優先,最好的辦法是寫成這樣((double)a)/b,這樣就沒有疑問了。

編寫示例程式,把本章節介紹的知識點全部演示一遍,用程式演示可以加深您的理解和映象。

C語言資料型別轉換

自動轉換發生在不同資料型別的量混合運算時,由編譯系統自動完成。自動轉換遵循以下規則 若參與運算量的型別不同,則先轉換成同一型別,然後進行運算。轉換按資料長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型後再進行運算。所有的浮點運算都是以雙精度進行的,即使僅...

C語言資料型別轉換

變數的資料型別是可以轉換的。轉換的方法有兩種,一種是自動轉換,一種是強制轉換。自動轉換發生在不同資料型別的量混合運算時,由編譯系統自動完成。自動轉換遵循以下規則 若參與運算量的型別不同,則先轉換成同一型別,然後進行運算。轉換按資料長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先...

C語言資料型別轉換

資料型別轉換就是將資料 變數 表示式的結果 從一種型別轉換到另一種型別。例如,為了儲存小數你可以將int型別的變數轉換為double型別。資料型別轉換的一般格式為 type name expressiontype name為要轉換到的資料型別,expression為表示式。例如 float a 把a...