Chinaunix首页 | 论坛 | 博客
  • 博客访问: 442904
  • 博文数量: 127
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 810
  • 用 户 组: 普通用户
  • 注册时间: 2013-07-02 20:51
文章分类

全部博文(127)

文章存档

2018年(6)

2015年(18)

2014年(33)

2013年(70)

分类: C/C++

2013-07-02 21:32:02

 

有符号和无符号的转换

unsigned int x    ->这是定义一个无符号数。

Int x                     ->这是定义一个有符号数。

ANSI C手册中有如下说明:

       Char,short,int或者int型位段,包括他们的有符号和无符号变型,以及枚举类型,可以使用在需要int或者unsigned int的表达式中。如果int可以完整的表示源类型的所有值,那么该源类型的值就转换为int,否则转换为unsigned int。这被称为整形升级。

       OK,看下边的代码:

这个程序的运算结果是打印 "Oops ,funny !"。

If语句在signed int和unsigned int之间测试相等性,因为sizeof返回结果是unsigned int型,结果d被升级为了unsigned int类型,导致了错误,这个bug存在ANSI C中。如果要修正这个问题,需要进行强制类型转换,如下:

这能不能算是个bug?ANSI C中进行了明确的定义,这不算是一个bug,只能说程序书写是有问题的,所以一定要避免这种问题的发生,尤其是有符号数和无符号数操作的时候,一定要注意有符号数会不会被转换为无符号数,这将造成非常重大的错误。

建议:

       尽量不要再你的代码中使用无符号类型,以免增加不必要的复杂性。尤其是,不要仅仅因为无符号数不存在负值(如年龄,时间)而用它来表示数量。

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