強制類型轉換是經過類型轉換運算來實現的。其通常形式爲: (類型說明符) (表達式) 其功能是把表達式的運算結果強制轉換成類型說明符所表示的類型。例如: (float) a 把a轉換爲實型(int)(x+y) 把x+y的結果轉換爲整型在使用強制轉換時應注意如下問題:
1.類型說明符和表達式都必須加括號(單個變量能夠不加括號),如把(int)(x+y)寫成(int)x+y則成了把x轉換成int型以後再與y相加了。
2.不管是強制轉換或是自動轉換,都只是爲了本次運算的須要而對變量的數據長度進行的臨時性轉換,而不改變數聽說明時對該變量定義的類型。spa
例1:
main()
{
float f=5.75;
printf("(int)f=%d,f=%f/n",(int)f,f);
}
f<--5.75
將float f強制轉換成int f float f=5.75;printf("(int)f=%d,f=%f/n",(int)f,f); 本例代表,f雖強制轉爲int型,但只在運算中起做用, 是臨時的,而f自己的類型並不改變。所以,(int)f的值爲 5(刪去了小數)而f的值仍爲5.75。設計
例2:對象
好比咱們能夠(int)'A',這樣轉換後的結果爲A的ASCII碼數值,由於那塊內存原本就存的那個數,只是換個形式使用而已。 知道上面的原則,咱們能夠對任何數據類型進行轉換,可是轉換的結果可能不是你想像的結果,舉例(int)'9'的結果爲多少?不是9而是0x39。來個高 深點的printf("%d",'12');的輸出是什麼?正確答案是12849,由於printf("%d",'12'),打印的是存儲12的內存地址 上的內容,即ASCII碼值,12的低位數存儲在低位地址,即1存儲在低位,高位存儲在高位地址,0x32就是2的ASCII碼,0x31就是1的 ASCII碼,因此是0x3231,轉換成10進制就是12849!內存
● 字符型變量的值實質上是一個8位的整數值,所以取值範圍通常是-128~127,char型變量也能夠加修飾符unsigned,則unsigned char 型變量的取值範圍是0~255(有些機器把char型當作unsighed char型對待, 取值範圍老是0~255)。
● 若是一個運算符兩邊的運算數類型不一樣,先要將其轉換爲相同的類型,即較低類型轉換爲較高類型,而後再參加運算,轉換規則以下圖所示。
double ←── float 高
↑
long
↑
unsigned
↑
int ←── char,short 低
● 圖中橫向箭頭表示必須的轉換,如兩個float型數參加運算,雖然它們類型相同,但仍要先轉成double型再進行運算,結果亦爲double型。 縱向箭頭表示當運算符兩邊的運算數爲不一樣類型時的轉換,如一個long 型數據與一個int型數據一塊兒運算,須要先將int型數據轉換爲long型, 而後二者再進行運算,結果爲long型。全部這些轉換都是由系統自動進行的, 使用時你只需從中瞭解結果的類型便可。這些轉換能夠說是自動的,但然,C語言也提供了以顯式的形式強制轉換類型的機制。
● 當較低類型的數據轉換爲較高類型時,通常只是形式上有所改變, 而不影響數據的實質內容, 而較高類型的數據轉換爲較低類型時則可能有些數據丟失。編譯
賦值中的類型轉換變量
當賦值運算符兩邊的運算對象類型不一樣時,將要發生類型轉換, 轉換的規則是:把賦值運算符右側表達式的類型轉換爲左側變量的類型。具體的轉換以下:
(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型變量時, 內部存儲形式不變,但外部表示時老是無符號的。
/*例:賦值運算符舉例 */
main()
{ unsigned a,b;
int i,j;
a=65535;
i=-1;
j=a;
b=i;
printf("(unsigned)%u→(int)%d/n",a,j);
printf("(int)%d→(unsigned)%u/n",i,b);
}
運行結果爲:
(unsigned)65535→(int)-1
(int)-1→(unsigned)65535
● 計算機中數據用補碼錶示,int型量最高位是符號位,爲1時表示負值,爲0時表示正值。若是一個無符號數的值小於32768則最高位爲0,賦給 int型變量後、獲得正值。若是無符號數大於等於32768,則最高位爲1, 賦給整型變量後就獲得一個負整數值。反之,當一個負整數賦給unsigned 型變量時,獲得的無符號值是一個大於32768的值。
● C語言這種賦值時的類型轉換形式可能會令人感到不精密和不嚴格,由於無論表達式的值怎樣,系統都自動將其轉爲賦值運算符左部變量的類型。
● 而轉變後數據可能有所不一樣,在不加註意時就可能帶來錯誤。 這確實是個缺點,也遭到許多人們批評。但不該忘記的是:c面言最初是爲了替代彙編語言而設計的,因此類型變換比較隨意。固然, 用強制類型轉換是一個好習慣,這樣,至少從程序上能夠看出想幹什麼。數據類型