C語言中關於強制類型轉換問題


由於朋友問到,所以整理了一份,若關於一些認識有錯誤還望指出......

 

● 如果一個運算符兩邊的運算數類型不同,先要將其轉換為相同的類型,即較低類型轉換為較高類型,然后再參加運算,轉換規則如下圖所示。

 double ←── float 高

 ↑ 

long 

↑ 
unsigned 

↑ 
int ←── char,short 低

 

●簡單的說強制類型轉換有顯式轉換、隱式轉換

比如:

//比如

//此時int型的變量a就被強制轉化為了float型,b不變
//此時a=3.000000 (float默認保留小數點后六位)
main()
{
     int a;
     int b=3;
     a=(float)b;
}

再比如:

//再比如

//一個初學C會遇到的一個攝氏度轉換的算法
// f為輸入的溫度,c為轉化后的溫度
main()
{
     float c,f;
     scanf("%f",&f);
     c=5*(f-32)/9;
}

//根據優先級問題,先算括號里面的,即f-32,由於f是float型,則f-32也是float型
//5和9都是int型,5*(f-32)就是int型與float的乘積,此時的int會自動轉換為float型
//同理,再除9,最終c為float型。



/**************************************************************
   但是也會有下面的問題
   有些同學會把 c=5*(f-32)/9的公式改寫成 c=5/9*(f-32);
   即先用5/9再乘括號里的東西,這樣的話輸出結果會直接為0,
   因為:
         5   9均為int型,int/int=int   所以5/9=0  0乘任何數都為0
**************************************************************/

還有關於float、double輸入輸出時的類型轉換

 

//關於float double輸入輸出時的類型轉換

//比如:
main()
{
     float a;
     double b;
     scanf("%f",&a);
     printf("%f\n",a);

     scanf("%lf",&b);   
     printf("%lf\n",b);//或者此行代碼可改為 printf("%f",b); 
}

/*****************************************************************
     為什么float型輸入輸出和double看似一樣又不一樣呢?
     %f大家都知道是float的輸入和輸出
     那%lf呢?這里是個必須要記住的地方,
     double型變量scanf里面必須是"%lf"  你可以把double理解為long float
     但是為什么double輸出可以的%lf也可以是%f呢
     就是相當於把%lf按照%f的類型輸出了唄,一般情況下double輸出用%f多些
*****************************************************************/

 

● 當較低類型的數據轉換為較高類型時,一般只是形式上有所改變, 而不影響數據的實質內容, 而較高類型的數據轉換為較低類型時則可能有些數據丟失。

以下為整理得到的一些  賦值中的類型轉換 :
當賦值運算符兩邊的運算對象類型不同時,將要發生類型轉換, 轉換的規則是:把賦值運算符右側表達式的類型轉換為左側變量的類型。具體的轉換如下:

 (1) 浮點型與整型 
● 將浮點數(單雙精度)轉換為整數時,將舍棄浮點數的小數部分, 只保留整數部分。 將整型值賦給浮點型變量,數值不變,只將形式改為浮點形式, 即小數點后帶若干個0。注意:賦值時的類型轉換實際上是強制的。

 (2) 單、雙精度浮點型 
● 由於c語言中的浮點值總是用雙精度表示的,所以float 型數據只是在尾部加0延長為doub1e型數據參加運算,然后直接賦值。doub1e型數據轉換為float型時,通過截尾數來實現,截斷前要進行四舍五入操作。

 (3) char型與int型 
● int型數值賦給char型變量時,只保留其最低8位,高位部分舍棄。 
● chr型數值賦給int型變量時, 一些編譯程序不管其值大小都作正數處理,而另一些編譯程序在轉換時,若char型數據值大於127,就作為負數處理。對於使用者來講,如果原來char型數據取正值,轉換后仍為正值;如果原來char型值可正可負,則轉換后也仍然保持原值, 只是數據的內部表示形式有所不同。

 (4) int型與1ong型 
● long型數據賦給int型變量時,將低16位值送給int型變量,而將高16 位截斷舍棄。(這里假定int型占兩個字節)。 

將int型數據送給long型變量時,其外部值保持不變,而內部形式有所改變。 

(5) 無符號整數 
● 將一個unsigned型數據賦給一個占據同樣長度存儲單元的整型變量時(如:unsigned→int、unsigned long→long,unsigned short→short) ,原值照賦,內部的存儲方式不變,但外部值卻可能改變。 
● 將一個非unsigned整型數據賦給長度相同的unsigned型變量時, 內部存儲形式不變,但外部表示時總是無符號的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM