本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。作者:gfree.wind@gmail.com博客:linuxfocus.blog.chinaunix.net 今天读到C99关于整数提升的规则,发现自己一直自诩已经很熟悉C语言了,居然在整数提升这个概念,也有误解。请看下面的代码:#include stdlib.h>#include stdio.h>#define PRINT_COMPARE_RESULT(a, b) \    if (a > b) { \        printf( #a " > " #b "\n"); \    } \    else if (a b) { \        printf( #a " #b "\n"); \    } \    else { \        printf( #a " = " #b "\n" ); \    }int main(){    int a = -1;    unsigned short b = 2;    unsigned int c = 2;    PRINT_COMPARE_RESULT(a,b);    PRINT_COMPARE_RESULT(a,c);    return 0;}对于很初级的程序员来说,判断结果估计是a a 对于整数提升有概念的同学你觉得这个答案对吗?也许你会很轻松的说"a c"。但是对于"a下面看这个程序的输出:[xxx@xxx-vm-fc13 test]$ gcc -g -Wall test.c[xxx@xxx-vm-fc13 test]$ ./a.outa ba > c在没有读到C99标准中关于整数提升的那一段时,我会认为结果是a > ba > c我认为有符号数和无符号数比较时,有符号数都会被转换为无符号数,所以a既会大于b,也会大于c。那么整数提升的规则到底是怎样规定的呢?http://blog.chinaunix.net/space.php?uid=23629988&do=blog&id=2938697 请看我这篇博文。对于这个问题,简要说明一下这里的整数提升的具体情况:1. 当a与b比较时,a作为int可表示的范围比b要大,所以b发生整数提升,从unsigned short转为int——也就是说,无符号数也会提升为有符号数的;2. 当a与c比较时,a作为int可表示的范围要小于unsigned int,所以a发生提升,从int转为unsigned int。所以尽管我们可能已经使用C语言多年了,但是很多细节的概念也许还是不是彻底清楚。还是要谦虚谨慎啊!更新:此文还有理解不准确的地方,另也一篇博文更新:http://blog.chinaunix.net/space.php?uid=23629988&do=blog&id=2950299
12-22 21:34