C語言函數類型提升問題

看到一篇討論,

http://bbs.csdn.net/topics/370074973

感覺不錯。自己總結一下:

第一:有符號,無符號提升順序爲,char,unsigned char,  short ,unsigned short, int, unsigned int, long, unsigned long,,long long, unsigned long long....。這樣的提升順序不會丟失數據。這點灰常重要。

比如:

#include<stdio.h>

int main(void)
{
    unsigned char a=1;

    if(a<-1)
    {
        printf("1<-1\n");
    }

}
由於 a 是 unsigned char 的, -1 是 signed int 的,所以 a被提升爲 siigned int,  爲+1, printf( "1<-1\n")就不會執行了。

如果把 a 改爲 unsigned int, 那麼 -1 將提升爲 unsigned int, 變爲0xFFFFFFFF, 這樣還是-1大,那麼, printf( "1<-1\n")就輸出了。


對於下面代碼:

  1 #include <stdio.h>
  2 int main()
  3 {
  4     int a = -1;
  5     if( a < 0x8FFFFFFF ){
  6         printf( "1 < -1\n" );
  7     }
  8 }
printf()不輸出的,我想是因爲0x8FFFFFFF超出了signed int 的範圍,所以 a被提升爲 unsigned int, 這樣-1就成老大哥了。


再來看一個:

  1 #include <stdio.h>
  2 int main()
  3 {
  4     int a = -1;
  5     if( a < 0x0FFFFFFF ){
  6         printf( "1 < -1\n" );
  7     }
  8 }
printf()會輸出的,因爲0x0FFFFFFF沒有超過signed int的範圍,所以上面兩個是 signed int 的比較。


很有意思的C語言類型提升啊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章