C的隐式类型转换
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
C的隱式類型轉(zhuǎn)換
隱式類型轉(zhuǎn)換分三種,即算術(shù)轉(zhuǎn)換、賦值轉(zhuǎn)換和輸出轉(zhuǎn)換。
1.算術(shù)轉(zhuǎn)換
?? ?進行算術(shù)運算(加、減、乘、除、取余以及符號運算)時,不同類型數(shù)招必須轉(zhuǎn)換成同 一類型
????的數(shù)據(jù)才能運算,算術(shù)轉(zhuǎn)換原則為:
? ? 1.1?整型提升:
????對于所有比int小的類型,包括char, signed char, unsigned char, short,?unsigned short,
????首先會提升為int類型。
?? ?在進行運算時,以表達式中最長類型為主,將其他類型位據(jù)均轉(zhuǎn)換成該類型,如:
????(1)若運算數(shù)中有double型或float型,則其他類型數(shù)據(jù)均轉(zhuǎn)換成double類型進行運算。
????(2)若運算數(shù)中最長的類型為long型.則其他類型數(shù)均轉(zhuǎn)換成long型數(shù)。
????(3)若運算數(shù)中最長類型為int型,則char型也轉(zhuǎn)換成int型進行運算。算術(shù)轉(zhuǎn)換是在運算過程中自
?????????動完成的。
? ? 1.2?特別注意的是有符號和無符號之間的轉(zhuǎn)換:
? ? ?包含long與unsigned int,32位機器上都是4字節(jié),所以均轉(zhuǎn)換為unsigned long.
? ? ?包含signed與unsigned int,signed會轉(zhuǎn)換為unsigned。如果int恰好為負數(shù),其結(jié)果為對
???? ?unsigned取值個數(shù)求模的結(jié)果。比如將-1賦給8位的unsigned char,呢么結(jié)果就是255
? ? (-1對256取模后的值)。unsigned char取值范圍0~255。
2.賦值轉(zhuǎn)換
?? ?進行賦值操作時,賦值運算符右邊的數(shù)據(jù)類型必須轉(zhuǎn)換成賦值號左邊的類型,若右邊的數(shù)據(jù)
????類型的長度大于左邊,則要進行截斷或舍入操作。
下面用一實例說明:
char?ch; int?i,result; float?f; double?d; result=ch/i+(f*d-i);(1)首先計算 ch/i,ch → int型,ch/i → int型。
(2)接著計算 f*d-i,由于最長型為double型,故f→double型,i→double型,f*d-i→double型。
(3)(ch/i) 和(f*d-i)進行加運算,由于f*d-i為double型,故ch/i→double型,ch/i+(f*d-i)→double型。
(4)由于result為int型,故ch/i+(f*d-i)→double→int,即進行截斷與舍入,最后取值為整型。
3.輸出轉(zhuǎn)換
?? ?在程序中將數(shù)據(jù)用printf函數(shù)以指定格式輸出時,當要輸出的鹽據(jù)類型與輸出格式不符時,便自
????動進行類型轉(zhuǎn)換,如一個long型數(shù)據(jù)用整型格式(%d)輸出時,則相當于將long型轉(zhuǎn)換成整型
????(int)數(shù)據(jù)輸出;一個字符(char)型數(shù)據(jù)用整型格式輸出時,相當于將char型轉(zhuǎn) 換成int型輸出。
????注意:較長型數(shù)據(jù)轉(zhuǎn)換成短型數(shù)據(jù)輸出時,其值不能超出短型數(shù)據(jù)允許的值范圍,否則 轉(zhuǎn)換時
????將出錯。如:
long?a=80000; printf("%d",a);?????運行結(jié)果為14464,因為int型允許的最大值為32767,80000超出此值,故結(jié)果取以32768
? ? ?為模的余數(shù),即進行如下取余運算:
(80000-32768)-32768=14464;????輸出的數(shù)據(jù)類型與輸出格式不符時常常發(fā)生錯誤,如:
int?d=9; printf("%f",d);????或
float?c=3.2; printf("%d",c);????將產(chǎn)生錯誤的結(jié)果。
轉(zhuǎn)載于:https://my.oschina.net/Ccx371161810/blog/293941
總結(jié)
- 上一篇: 设计模式1——单例
- 下一篇: Linux程序编译速度提高方法