一次修bug小记

最近到一家游戏公司工作,前几天公司游戏服务端有个bug是这样的:

unsigned short LID = -1;  //LID的值在其他地方可能会被改写!
.....
if (LID == -1)
    ...
else
    ...


写这句话的coder和我一样都认为如果usLID值没被改写,应该执行if后面的语句,其实真正的结果是执行else后面的语句,也就是说那个表达式结果为false。于是就有了bug。但是为什么是false呢??
因为c的标准里有这样一条:

    Otherwise, if the type of the operand with signed integer type can represent all of the values of the type of the operand with unsigned integer type, then the operand with unsigned integer type is converted to the type of the operand with signed integer type.

    Otherwise, both operands are converted to the unsigned integer type corresponding to the type of the operand with signed integer type.

常量在c/c++里默认是int型,所以这是一个unsigned short型和int型的比较,由于int型可以装的下unsigned short的所有结果,所以左边的LID被提升为int型,结果这个表达式变成了65535 == -1 这不是永远都是false么??但是如果LID是unsigned int,根据上面这句话,左右两边都会被提升为unsigned int,这个结果就变成true了。所以说,隐式转换有时候会害死人,如果写这句话的coder用显示转换LID == (unsigned short) -1这里就不会有bug了。大家要引以为戒啊!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.