二級(jí)C基礎(chǔ):C整型升級(jí)和尋常算術(shù)轉(zhuǎn)換實(shí)例(4)

字號(hào):

整型提升就是char、short int和位段類型(無論signed或unsigned)以及枚舉類型將被提升為int,前提是int 能夠完整地容納原先的數(shù)據(jù),否則將被轉(zhuǎn)換為unsigned int。
    ANSI C表示,如果編譯器能夠保證運(yùn)算結(jié)果一致,也可以省略類型提升——這通常出現(xiàn)在表達(dá)式中存在常量操作數(shù)的時(shí)候。
    另一個(gè)會(huì)發(fā)生隱式類型轉(zhuǎn)換的地方就是參數(shù)傳遞。
    在K&R C中,由于函數(shù)的參數(shù)也是表達(dá)式,所以也會(huì)發(fā)生類型提升;在ANSI C中,如果使用了適當(dāng)?shù)暮瘮?shù)原型,類型提升便不會(huì)發(fā)生,否則也會(huì)發(fā)生。
    在被調(diào)用函數(shù)的內(nèi)部,提升后的參數(shù)被裁減為原先聲明的大小。
    這就是為什么單個(gè)的printf()格式字符串%d能適用于幾個(gè)不同類型,short、char或int,而不論實(shí)際傳遞的是上述類型的哪一個(gè)。
    函數(shù)從堆棧中(或寄存器中)取出的參數(shù)總是int類,并在printf或其他被調(diào)用函數(shù)里按統(tǒng)一的格式處理。
    printf是一個(gè)可變參數(shù)函數(shù),此時(shí)一般的參數(shù)提升始終會(huì)發(fā)生。