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

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 
  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 
  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语言类型提升啊。

你可能感兴趣的:(C,Language)