| 首先引出一個(gè)問(wèn)題,這是我在編寫模擬器程序的時(shí)候遇到的,我們有如下的類型轉(zhuǎn)換: int16_t v16s; uint16_t v16u; int32_t v32s; uint32_t v32u; v16s = 0xf08b; v16u = (uint16_t)v16s; //請(qǐng)問(wèn)此時(shí)v16s和v16u在二進(jìn)制表示形式上有什么不同嗎? No.1 v32s = (int32_t)v16s; v32u = (uint32_t)v16s; //請(qǐng)問(wèn)此時(shí)v32s和v32u在二進(jìn)制表示形式上相同嗎? No.2 v16s = 0x0f8b; v32s=(int32_t)v16s; v32u=(uint32_t)v16s; //請(qǐng)問(wèn)此時(shí)v32s和v32u的值又是多少? No.3 v32s = 0xffff0fb8; v16s=(int16_t)v32s; v16u=(uint16_t)v32s;//請(qǐng)問(wèn)此時(shí)v16s和v16u的值是多少? No.4 v16s = 0xf08b; v16u=0xf08b; v32s=(int32_t)v16s; v32u=(uint32_t)v16u; //請(qǐng)問(wèn)此時(shí)v32s和v32u的值是多少? No.5 首先告訴大家答案: 
 對(duì)于自動(dòng)類型轉(zhuǎn)換,最常見的就是混合運(yùn)算以及賦值運(yùn)算,還有一種就是函數(shù)值的類型轉(zhuǎn)換 
 可以利用強(qiáng)制類型轉(zhuǎn)換運(yùn)算符將一個(gè)表達(dá)式轉(zhuǎn)換成所需類型: 例如: (double)a (將a轉(zhuǎn)換成double類型) (int)(x+y) (將x+y的值轉(zhuǎn)換成整型) (float)(5%3) (將5%3的值轉(zhuǎn)換成float型) (int)(1.5+2.3) = ? (int)1.5+2.3=? 注意,表達(dá)式應(yīng)該用括號(hào)括起來(lái)。如果寫成(int)x+y 則只將x轉(zhuǎn)換成整型,然后與y相加。 講到這里,您或許就明白了,哦,原來(lái)我們是使用了強(qiáng)制類型轉(zhuǎn)換的語(yǔ)法,但是程序?qū)嵸|(zhì)上卻是自動(dòng)類型轉(zhuǎn)換! 所以在執(zhí)行了語(yǔ)句:v16s = 0xf08b; v32s=(int32_t)v16s; v32u=(uint32_t)v16s; 后v32s和v32u的二進(jìn)制表示形式才是一樣的! 對(duì)于從高到低的強(qiáng)制轉(zhuǎn)換,實(shí)質(zhì)上就是一個(gè)截?cái)嗟牟僮?,只把低端需要的部分保留,其余的部分直接扔掉了。所以?duì)于語(yǔ)句: v32s = 0xffff0fb8; v16s=(int16_t)v32s; v16u=(uint16_t)v32s; 執(zhí)行之后v16s和v16u的二進(jìn)制表示形式才是一樣的! 注:我一直強(qiáng)調(diào)的都是它們的二進(jìn)制表示形式是否相同,而沒(méi)有說(shuō)它們的值是否相同,因?yàn)橥瑯拥亩M(jìn)制表示形式,你把它當(dāng)作有符號(hào)數(shù)和無(wú)符號(hào)數(shù)的值在決大部分的情況下都是不同的(除了最高位為0的相同外,其他都不同) 混合運(yùn)算  混合運(yùn)算是指在一個(gè)表達(dá)式中參與運(yùn)算的對(duì)象不是相同的數(shù)據(jù)類型,例如: int a, j, y; float b; long d; double c; 則對(duì)賦值語(yǔ)句: y=j+'a'+a*b-c/d; 其運(yùn)算次序和隱含的類型轉(zhuǎn)換如下: ?、?計(jì)算a*b,由于變量b為float型,所以運(yùn)算時(shí)先由系統(tǒng)自動(dòng)轉(zhuǎn)換為double型,變量a為int型,兩個(gè)運(yùn)算對(duì)象要保持類型一致,變量a也要轉(zhuǎn)換為double,運(yùn)算結(jié)果為double型。 ?、?由于c為double型,將 d 轉(zhuǎn)換成 double 型,再計(jì)算 c/d,結(jié)果為double型。 ③ 計(jì)算j+'a',先將'a'(char型)轉(zhuǎn)換成整型數(shù)再與j相加,結(jié)果為整型。 ?、?將第1步和第3步的結(jié)果相加,先將第3步的結(jié)果(int)轉(zhuǎn)換成double型再進(jìn)行運(yùn)算,結(jié)果為double型。 ?、?用第4步的結(jié)果減第2步的結(jié)果,結(jié)果為double型。 ?、?給y賦值,先將第5步的結(jié)果double型轉(zhuǎn)換為整型(因?yàn)橘x值運(yùn)算左邊變量y為整型),即將double型數(shù)據(jù)的小數(shù)部分截掉,壓縮成int型,然后進(jìn)行賦值。 以上步驟中的類型轉(zhuǎn)換都是C語(yǔ)言編譯系統(tǒng)自動(dòng)完成的。 | 
|  | 
來(lái)自: angelbrian > 《囧~VC》