本文的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 < b
a < c
对于整数提升有概念的同学你觉得这个答案对吗?也许你会很轻松的说"a < c"是错的,因为整数提升的关系,a在与c进行比较的时候,转为了无符号数,那么-1即为0xFFFFFFFF是无符号数里面最大值,自然大于c了。所以应该为"a > c"。
但是对于"a
下面看这个程序的输出:
- [xxx@xxx-vm-fc13 test]$ gcc -g -Wall test.c
-
[xxx@xxx-vm-fc13 test]$ ./a.out
-
a < b
-
a > c
在没有读到C99标准中关于整数提升的那一段时,我会认为结果是
a > b
a > c
我认为有符号数和无符号数比较时,有符号数都会被转换为无符号数,所以a既会大于b,也会大于c。
对于这个问题,简要说明一下这里的整数提升的具体情况:
1. 当a与b比较时,a作为int可表示的范围比b要大,所以b发生整数提升,从unsigned short转为int——也就是说,无符号数也会提升为有符号数的;
2. 当a与c比较时,a作为int可表示的范围要小于unsigned int,所以a发生提升,从int转为unsigned int。
所以尽管我们可能已经使用C语言多年了,但是很多细节的概念也许还是不是彻底清楚。还是要谦虚谨慎啊!
阅读(6177) | 评论(4) | 转发(3) |