C語言中的整型提升(integral promotion)

來源:互聯網
上載者:User
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規定,編譯器如果能保證保證運算結果一致,也可以省略型別提升的操作——這通常出現在運算式中存在常量運算元的時候。

    但願我的文章沒有誤導讀到此文的人。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.