分类: 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,只能说程序书写是有问题的,所以一定要避免这种问题的发生,尤其是有符号数和无符号数操作的时候,一定要注意有符号数会不会被转换为无符号数,这将造成非常重大的错误。
建议:
尽量不要再你的代码中使用无符号类型,以免增加不必要的复杂性。尤其是,不要仅仅因为无符号数不存在负值(如年龄,时间)而用它来表示数量。