K&R C中關(guān)于整型提升(integral promotion)的定義為: "A character, a short integer, or an integer bit-field, all either signed or not, or an object of enumeration type, may be used in an expression wherever an integer maybe used. If an int can represent all the values of the original type, then the value is converted to int; otherwise the value is converted to unsigned int. This process is called integral promotion." 上面的定義歸納下來(lái)就是以下兩個(gè)原則: 1). 只要一個(gè)表達(dá)式中用到了整型值,那么類(lèi)型為char、short int或整型位域(這幾者帶符號(hào)或無(wú)符號(hào)均可)的變量,以及枚舉類(lèi)型的對(duì)象,都可以被放在這個(gè)整型變量的位置。 2). 如果1)中的變量的原始類(lèi)型值域可以被int表示,那么原值被轉(zhuǎn)換為int;否則的話(huà),轉(zhuǎn)為unsigned int。 以上兩者作為一個(gè)整體,被稱(chēng)為整型提升(Integral promotion) 整型提升的概念容易與普通算術(shù)類(lèi)型轉(zhuǎn)換產(chǎn)生混淆。這兩者的區(qū)別之一在于后者是在操作數(shù)之間類(lèi)型不一致的情況下發(fā)生,最終將操作數(shù)轉(zhuǎn)換為同一類(lèi)型。而在算術(shù)運(yùn)算這種情景下,即使操作數(shù)具有相同的類(lèi)型,仍有可能發(fā)生整型提升。 例如: char a , b ,c; c=a + b; 在上述過(guò)程中,盡管兩個(gè)運(yùn)算符"+"和"="的操作數(shù)全為char型,但在中間計(jì)算過(guò)程中存在著整數(shù)提升:對(duì)于表達(dá)式a+b ,a、b都是char型,因此被提升至int型后,執(zhí)行“+”運(yùn)算,計(jì)算結(jié)果(int型)再賦值給c(char型),又執(zhí)行了隱式的類(lèi)型轉(zhuǎn)換。 是不是有一種很不相信的感覺(jué)?Me too,然而標(biāo)準(zhǔn)就是標(biāo)準(zhǔn)。可以使用下面的代碼證明上面所描述的過(guò)程。 printf ( " the size of the result of a+b :%d " ,sizeof( a+b) );
**********************************
unsigned char a=0xA5;
unsigned char b=~a>>4; printf("b=%d\n",b); 取反的優(yōu)先級(jí)高于移位。
1:整值提升 0xA5 == 10100101 -> 00000000 00000000 00000000 10100101 2:取反 00000000 00000000 00000000 10100101 -> 11111111 11111111 11111111 01011010 3:右移 11111111 11111111 11111111 01011010 >> 4 == 11111111 11111111 11111111 11110101(算術(shù)移位) 或者 00001111 11111111 11111111 11110101(邏輯移位) 4:截?cái)?BR>b == 0xf5即245 -------------------------------------------------------------------------------------------------------- 類(lèi)型轉(zhuǎn)換:不同類(lèi)型的數(shù)值數(shù)據(jù)進(jìn)行混合運(yùn)算時(shí),要先轉(zhuǎn)換成同一類(lèi)型之后再運(yùn)算。 1.自動(dòng)類(lèi)型轉(zhuǎn)換 2.強(qiáng)制類(lèi)型轉(zhuǎn)換
|
|
來(lái)自: changqiong0606 > 《C/C 》