Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8104251
  • 博文数量: 159
  • 博客积分: 10424
  • 博客等级: 少将
  • 技术积分: 14615
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-14 12:45
个人简介

啦啦啦~~~

文章分类
文章存档

2015年(5)

2014年(1)

2013年(5)

2012年(10)

2011年(116)

2010年(22)

分类: C/C++

2011-10-01 19:12:54

本文的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

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

GFree_Wind2012-07-26 09:35:04

freeloki: 标准中并没有强制要求sizeof(int) > sizeof(short)吧?只是说不小于,也就是sizeof(int) >= sizeof(short),如果在二者相等的情况下应该a > b吧?.....
是的。我觉得是这样

freeloki2012-07-26 09:15:11

标准中并没有强制要求sizeof(int) > sizeof(short)吧?只是说不小于,也就是sizeof(int) >= sizeof(short),如果在二者相等的情况下应该a > b吧?

GFree_Wind2011-10-07 17:24:47

Rainyzzj: 涉及到计算机组成原理的东西,如果知道unsigned类型和非unsigned在计算机表示上的区别,就不难理解了。我对那段宏更感兴趣,打开眼界,宏还可以这么写哦。
prin.....
#a,这里的#是将后面的参数变为字符串。
所以要写成printf(#a " > " #b "\n");
这样宏的两个参数,即为字符串形式。

你要写成printf("a>b\n");那么这里的a和b不会当成宏的参数。

Rainyzzj2011-10-05 11:54:59

涉及到计算机组成原理的东西,如果知道unsigned类型和非unsigned在计算机表示上的区别,就不难理解了。我对那段宏更感兴趣,打开眼界,宏还可以这么写哦。
printf( #a " > " #b "\n");
为什么是这么写呢?
可以写成下面的样子吗?
printf("a>b\n");