Chinaunix首页 | 论坛 | 博客
  • 博客访问: 264464
  • 博文数量: 52
  • 博客积分: 406
  • 博客等级: 一等列兵
  • 技术积分: 549
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-21 12:34
个人简介

......

文章分类

全部博文(52)

文章存档

2014年(1)

2013年(32)

2012年(19)

我的朋友

分类: LINUX

2013-09-28 16:49:43

作者: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

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