計算機進行算術運算時,要求各運算元的型別具有相同的大小(儲存位數)及儲存方式,不能將 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...