c語言中的強制類型轉(zhuǎn)換_第1頁
c語言中的強制類型轉(zhuǎn)換_第2頁
c語言中的強制類型轉(zhuǎn)換_第3頁
c語言中的強制類型轉(zhuǎn)換_第4頁
c語言中的強制類型轉(zhuǎn)換_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

一、自動類型轉(zhuǎn)換?字符型變量的值實質(zhì)上是一個8位的整數(shù)值,因此取值范圍一般是-128?127,char型變量也可以加修飾符unsigned,則unsignedchar型變量的取值范圍是0?255(有些機器把char型當做unsighedchar型對待,取值范圍總是0?255)。?如果一個運算符兩邊的運算數(shù)類型不同,先要將其轉(zhuǎn)換為相同的類型,即較低類型轉(zhuǎn)換為較高類型,然后再參加運算,轉(zhuǎn)換規(guī)則如下圖所示。double< float高TlongTunsignedTint< char,short低;?圖中橫向箭頭表示必須的轉(zhuǎn)換,如兩個float型數(shù)參加運算,雖然它們類型相同,但仍要先轉(zhuǎn)成double型再進行運算,結(jié)果亦為double型??v向箭頭表示當運算符兩邊的運算數(shù)為不同類型時的轉(zhuǎn)換,如一個long型數(shù)據(jù)與一個int型數(shù)據(jù)一起運算,需要先將int型數(shù)據(jù)轉(zhuǎn)換為long型,然后兩者再進行運算,結(jié)果為long型。所有這些轉(zhuǎn)換都是由系統(tǒng)自動進行的,使用時你只需從中了解結(jié)果的類型即可。這些轉(zhuǎn)換可以說是自動的,但然,C語言也提供了以顯式的形式強制轉(zhuǎn)換類型的機制。?當較低類型的數(shù)據(jù)轉(zhuǎn)換為較高類型時,一般只是形式上有所改變,而不影響數(shù)據(jù)的實質(zhì)內(nèi)容,而較高類型的數(shù)據(jù)轉(zhuǎn)換為較低類型時則可能有些數(shù)據(jù)丟失。二、賦值中的類型轉(zhuǎn)換當賦值運算符兩邊的運算對象類型不同時,將要發(fā)生類型轉(zhuǎn)換,轉(zhuǎn)換的規(guī)則是:把賦值運算符右側(cè)表達式的類型轉(zhuǎn)換為左側(cè)變量的類型。具體的轉(zhuǎn)換如下:浮點型與整型?將浮點數(shù)(單雙精度)轉(zhuǎn)換為整數(shù)時,將舍棄浮點數(shù)的小數(shù)部分,只保留整數(shù)部分。將整型值賦給浮點型變量,數(shù)值不變,只將形式改為浮點形式,即小數(shù)點后帶若干個0。注意:賦值時的類型轉(zhuǎn)換實際上是強制的。單、雙精度浮點型?由于C語言中的浮點值總是用雙精度表示的,所以float型數(shù)據(jù)只是在尾部加0延長為double型數(shù)據(jù)參加運算,然后直接賦值。double型數(shù)據(jù)轉(zhuǎn)換為float型時,通過截尾數(shù)來實現(xiàn),截斷前要進行四舍五入操作。char型與int型int型數(shù)值賦給char型變量時,只保留其最低8位,高位部分舍棄。chr型數(shù)值賦給int型變量時,一些編譯程序不管其值大小都作正數(shù)處理,而另一些編譯程序在轉(zhuǎn)換時,若char型數(shù)據(jù)值大于127,就作為負數(shù)處理。對于使用者來講,如果原來char型數(shù)據(jù)取正值,轉(zhuǎn)換后仍為正值;如果原來char型值可正可負,則轉(zhuǎn)換后也仍然保持原值,只是數(shù)據(jù)的內(nèi)部表示形式有所不同。int型與1ong型long型數(shù)據(jù)賦給int型變量時,將低16位值送給int型變量,而將高16位截斷舍棄。(這里假定int型占兩個字節(jié))。將int型數(shù)據(jù)送給long型變量時,其外部值保持不變,而內(nèi)部形式有所改變。無符號整數(shù)?將一個unsigned型數(shù)據(jù)賦給一個占據(jù)同樣長度存儲單元的整型變量時(如:unsigned—int、unsignedlong—long,unsignedshort—short),原值照賦,內(nèi)部的存儲方式不變,但外部值卻可能改變。?將一個非unsigned整型數(shù)據(jù)賦給長度相同的unsigned型變量時,內(nèi)部存儲形式不變,但外部表示時總是無符號的。/*例:賦值運算符舉例*/main()(unsigneda,b;inti,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);}運行結(jié)果為:(unsigned)65535—(int)-1(int)-1—(unsigned)65535?計算機中數(shù)據(jù)用補碼表示,int型量最高位是符號位,為1時表示負值,為0時表示正值。如果一個無符號數(shù)的值小于32768則最高位為0,賦給int型變量后、得到正值。如果無符號數(shù)大于等于32768,則最高位為1,賦給整型變量后就得到一個負整數(shù)值。反之,當一個負整數(shù)賦給unsigned型變量時,得到的無符號值是一個大于32768的值。?C語言這種賦值時的類型轉(zhuǎn)換形式可能會使人感到不精密和不嚴格,因為不官表達式的值怎樣,系統(tǒng)都自動將其轉(zhuǎn)為賦值運算符左部變量的類型。?而轉(zhuǎn)變后數(shù)據(jù)可能有所不同,在不加注意時就可能帶來錯誤。這確實是個缺點,也遭到許多人們批評。但不應(yīng)忘記的是:c面言最初是為了替代匯編語言而設(shè)計的,所以類型變換比較隨意。當然,用強制類型轉(zhuǎn)換是一個好習(xí)慣,這樣,至少從程序上可以看出想干什么。在C語言中,不同數(shù)據(jù)類型的運算對象進行混合運算,或者需要將一個表達式的結(jié)果轉(zhuǎn)換成期望的類型時,就需要依據(jù)數(shù)據(jù)類型轉(zhuǎn)換規(guī)則進行轉(zhuǎn)換。具體有以下幾種情況:2.8.1各類數(shù)值型數(shù)據(jù)間混合運算時的類型轉(zhuǎn)換規(guī)則整型、實型、字符型數(shù)據(jù)間可以混合運算。在這種情況下,需要將不一致的數(shù)據(jù)類型轉(zhuǎn)換成一致的數(shù)據(jù)類型,然后進行運算。為了保證運算精度,系統(tǒng)在運算時的轉(zhuǎn)換規(guī)則是將存儲長度較短的運算對象轉(zhuǎn)換成存儲長度較長的類型,然后再進行處理。這種轉(zhuǎn)換是系統(tǒng)自動進行的,具體如圖2-9所示。double< float高longTunsignedTint< char,short彳氐對圖2-9的說明如下:1) 縱向箭頭表示必定會進行的轉(zhuǎn)換,如float型數(shù)據(jù)必先轉(zhuǎn)換為double型數(shù)據(jù),然后與其他操作數(shù)進行運算。與此類似,char型或short型數(shù)據(jù)必先轉(zhuǎn)換為int型數(shù)據(jù),然后進行運算。2) 橫向箭頭表示當運算對象為不同類型數(shù)據(jù)時的轉(zhuǎn)換方向,如int型數(shù)據(jù)與unsigned型數(shù)據(jù)進行運算,int型轉(zhuǎn)換為unsigned型后方可進行運算。int型數(shù)據(jù)與double型數(shù)據(jù)進行運算,int型直接轉(zhuǎn)換為double型后進行運算,不能理解為先轉(zhuǎn)換為unsignedint型,然后轉(zhuǎn)換為longint型,最后再轉(zhuǎn)換為double型。2.8.2賦值時的類型轉(zhuǎn)換當賦值運算符兩側(cè)的類型不同時,需進行類型轉(zhuǎn)換,這種轉(zhuǎn)換也是系統(tǒng)自動進行的。具體轉(zhuǎn)換原則如下:1) float、double型賦值給int型:直接截斷小數(shù)。例如:inti=f+0.6;f的值4.0,右邊算術(shù)表達式運算后的結(jié)果為一個值為4.6的double型數(shù)據(jù),根據(jù)上述轉(zhuǎn)換原則,直接舍棄小數(shù),所以i的值為4。2) int、char型賦值給float、double型:補足有效位以進行數(shù)據(jù)類型轉(zhuǎn)換。例如:floatf=4;float為7位有效數(shù)字,所以f的值為4.000000。3) char型(1字節(jié))賦值給int型(2字節(jié)):數(shù)值賦給int的低8位,高8位補0。4) longint型賦值給int型:longint截斷低字節(jié)給int型。5) int型賦值給longint:賦給longint的低16位,如果int的最高位是0,則longint的高16位全為0;如果int的最高位是1,則longint的高8位全為1(稱為“符號擴展”)。6) unsignedint型賦值給int型:直接傳送數(shù)值。7) 非unsigned數(shù)據(jù)型賦值給位數(shù)相同的unsigned數(shù)據(jù):直接傳送數(shù)值。2.8.3強制類型轉(zhuǎn)換除了以上的兩種自動類型轉(zhuǎn)換外,在C語言中,允許強制類型轉(zhuǎn)換,將某一數(shù)據(jù)的數(shù)據(jù)類型轉(zhuǎn)換為指定的另一種數(shù)據(jù)類型。強制轉(zhuǎn)換是用強制轉(zhuǎn)換運算符進行的,強制轉(zhuǎn)換運算符為:(類型名),強制轉(zhuǎn)換運算符組成的運算表達式的一般形式為:(類型名)(表達式)例如:(int)(x+y) 〃將x+y的值轉(zhuǎn)換成整型,即取整數(shù)部分。(float)x+y 〃將x轉(zhuǎn)換成單精度型。強制轉(zhuǎn)換運算符優(yōu)先級比算術(shù)運算符高。同表達式中數(shù)據(jù)類型的自動轉(zhuǎn)換一樣,強制類型轉(zhuǎn)換也是臨時轉(zhuǎn)換,對原運算對象的類型沒有影響。例如,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論