C語言類型強制轉換

C語言類型強制轉換

強制類型轉換是通過類型轉換運算來實現的。其一般形式為: (類型說明符) (表達式) 其功能是把表達式的運算結果強制轉換成類型說明符所表示的類型。

基本信息

基本介紹

強制類型轉換是通過類型轉換運算來實現的。其一般形式為:(類型說明符)(表達式)其功能是把表達式的運算結果強制轉換成類型說明符所表示的類型。自動轉換是在源類型和目標類型兼容以及目標類型廣於源類型時發生一個類型到另一類的轉換。例如: (float) a 把a轉換為浮點型,(int)(x+y) 把x+y的結果轉換為整型。在使用強制轉換時應注意以下問題:

注意事項

1.類型說明符和表達式都必須加括弧(單個變數可以不加括弧),如把(int)(x+y)寫成(int)x+y則成了把x轉換成int型之後再與y相加了。

2.無論是強制轉換或是自動轉換,都只是為了本次運算的需要而對變數的數據長度進行的臨時性轉換,而不改變數據說明時對該變數定義的類型。

例1:

main()

{

float f=5.75;

printf("f=%d,f=%f\n",(int)f,f);

}

f=5,f=5.750000

將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而是57。來個高深點的printf("%d",‘12’);的輸出是什麼?正確答案是12594,因為printf("%d",'12'),列印的是存儲12的記憶體地址上的內容,即ASCII碼值2存儲在低位,1儲在高位地址,0x32就是2的ASCII碼,0x31就是1的ASCII碼,所以是0x3132,轉換成10進制就是12594!

● 字元型變數的值實質上是一個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延長為double型數據參加運算,然後直接賦值。double型數據轉換為float型時,通過截尾數來實現,截斷前要進行四捨五入操作。

(3) char型與int型

● int型數值賦給char型變數時,只保留其最低8位,高位部分捨棄。

● char型數值賦給int型變數時, 一些編譯程式不管其值大小都作正數處理,而另一些編譯程式在轉換時,若char型數據值大於127,就作為負數處理。對於使用者來講,如果原來char型數據取正值,轉換後仍為正值;如果原來char型值可正可負,則轉換後也仍然保持原值, 只是數據的內部表示形式有所不同。

(4) int型與long型

● long型數據賦給int型變數時,將低16位值送給int型變數,而將高16 位截斷捨棄。(這裡假定int型占兩個位元組)。 將int型數據送給long型變數時,其外部值保持不變,而內部形式有所改變。

(5) 無符號整數

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

● 將一個非unsigned整型數據賦給長度相同的unsigned型變數時, 內部存儲形式不變,但外部表示時總是無符號的。

/*例:賦值運算符舉例 */

運行結果為:(unsigned)65535→(int)-1(int)-1→(unsigned)65535

● 計算機中數據用補碼錶示,int型量最高位是符號位,為1時表示負值,為0時表示正值。如果一個無符號數的值小於32768則最高位為0,賦給 int型變數後、得到正值。如果無符號數大於等於32768,則最高位為1, 賦給整型變數後就得到一個負整數值。反之,當一個負整數賦給unsigned 型變數時,得到的無符號值是一個大於32768的值。

● C語言這種賦值時的類型轉換形式可能會使人感到不精密和不嚴格,因為不管表達式的值怎樣,系統都自動將其轉為賦值運算符左部變數的類型。

● 而轉變後數據可能有所不同,在不加注意時就可能帶來錯誤。 這確實是個缺點,也遭到許多人們批評。但不應忘記的是:c語言最初是為了替代彙編語言而設計的,所以類型變換比較隨意。當然, 用強制類型轉換是一個好習慣,這樣,至少從程式上可以看出想乾什麼。

相關詞條

相關搜尋

熱門詞條

聯絡我們