Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1685956
  • 博文数量: 511
  • 博客积分: 967
  • 博客等级: 准尉
  • 技术积分: 2560
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-06 14:19
文章分类

全部博文(511)

文章存档

2016年(11)

2015年(61)

2014年(257)

2013年(63)

2012年(119)

分类: C/C++

2014-05-17 22:52:41

本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
作者:gfree.wind@gmail.com
博客:linuxfocus.blog.chinaunix.net
 

今天读到C99关于整数提升的规则,发现自己一直自诩已经很熟悉C语言了,居然在整数提升这个概念,也有误解。

请看下面的代码:
  1. #include <stdlib.h>
  2. #include <stdio.h>


  3. #define PRINT_COMPARE_RESULT(a, b) \
  4.     if (a > b) { \
  5.         printf( #a " > " #b "\n"); \
  6.     } \
  7.     else if (a < b) { \
  8.         printf( #a " < " #b "\n"); \
  9.     } \
  10.     else { \
  11.         printf( #a " = " #b "\n" ); \
  12.     }

  13. int main()
  14. {
  15.     int a = -1;
  16.     unsigned short b = 2;
  17.     unsigned int c = 2;

  18.     PRINT_COMPARE_RESULT(a,b);
  19.     PRINT_COMPARE_RESULT(a,c);

  20.     return 0;
  21. }


对于很初级的程序员来说,判断结果估计是
a < b
a < c

对于整数提升有概念的同学你觉得这个答案对吗?也许你会很轻松的说"a < c"是错的,因为整数提升的关系,a在与c进行比较的时候,转为了无符号数,那么-1即为0xFFFFFFFF是无符号数里面最大值,自然大于c了。所以应该为"a > c"。

但是对于"a

下面看这个程序的输出:
  1. [xxx@xxx-vm-fc13 test]$ gcc -g -Wall test.c
  2. [xxx@xxx-vm-fc13 test]$ ./a.out
  3. a < b
  4. a > c
在没有读到C99标准中关于整数提升的那一段时,我会认为结果是
a > b
a > 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

阅读(609) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~