Chinaunix首页 | 论坛 | 博客
  • 博客访问: 963813
  • 博文数量: 145
  • 博客积分: 1302
  • 博客等级: 中尉
  • 技术积分: 1778
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-07 16:00
文章分类

全部博文(145)

文章存档

2018年(1)

2016年(1)

2015年(6)

2014年(4)

2013年(59)

2012年(32)

2011年(36)

2009年(1)

2007年(2)

2006年(3)

分类: LINUX

2011-04-01 16:00:56

1 #include <stdio.h>
 2 
 3 int array[] = {2324 ,12204};
 4 #define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
 5 
 6 void main()
 7 {
 8  int d = -1;
 9  if(d <= TOTAL_ELEMENTS)
10   printf("TRUE\n");
11 }

 

运行结果是不打印TRUE。

 

解释:TOTAL_ELEMENT所定义的值是unsigned int类型,因为sizeof()返回类型是无符号数。if语句在signed int和unsigned int之间测试大小关系,所以d被提升为unsigned int类型。 -1转换成unsigned int 的结果将是一个非常巨大的正整数,导致if判断为假。

 

解决方法:可以修改第四行为:#define TOTAL_ELEMENTS (int)(sizeof(array)/sizeof(array[0]))

 

建议:

        尽量不要在代码中使用无符号类型,以免增加不必要的复杂性。尤其是,不要仅仅因为无符号数不存在负值(如年龄、国债等)而用它来表示数量。尽量使用int那样的有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心边界的情况(如-1被转化为非常大的正整数)。

        只有在使用位段和二进制掩码的时候,才可以使用无符号数。应该在表达式中使用强制类型转化,是操作数均为有符号数或者无符号数,避免编译器来选择结果的类型。

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