K&R C中關於整型提升(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."
上面的定義歸納下來就是以下兩個原則:
1). 只要一個運算式中用到了整型值,那麼類型為char、short int活整型位域(這幾者帶符號或無符號均可)的變數,以及枚舉類型的對象,都可以被放在這個整型變數的位置。
2). 如果1)中的變數的原始類型範圍可以被int表示,那麼原值被轉換為int;否則的話,轉為unsigned int。
以上兩者作為一個整體,被成為整型提升(Integral promotion)
整型提升的概念容易與普通算術類型轉換產生混淆。這兩者的區別之一在於後者是在運算元之間類型不一致的情況下發生,最終將運算元轉換為同一類型。而在算術運算這種情景下,即使運算元具有相同的類型,仍有可能發生整型提升。
例如:
char a , b ,c;
c=a + b;
在上述過程中,儘管兩個運算子"+"和"="的運算元全為char型,但在中間計算過程中存在著整數提升:對於運算式a+b ,a、b都是char型,因此被提升至int型後,執行“+”運算,計算結果(int型)再賦值給c(char型),又執行了隱式的類型轉換。
是不是有一種很不相信的感覺?Me too,然而標準就是標準。可以使用下面的代碼證明上面所描述的過程。
printf ( " the size of the result of a+b :%d " ,sizeof( a+b) );
理解了整型提升的概念後,面對下面這個C語言的FAQ,你應該不會產生困惑了
“ 為什麼語句 printf( "%d",sizeof ('A') ); 的輸出結果是4呢?char類型長度不是1位元組嗎? ”
最後提一句,ANSI C規定,編譯器如果能保證保證運算結果一致,也可以省略型別提升的操作——這通常出現在運算式中存在常量運算元的時候。
但願我的文章沒有誤導讀到此文的人。