Chinaunix首页 | 论坛 | 博客
  • 博客访问: 574002
  • 博文数量: 493
  • 博客积分: 2891
  • 博客等级: 少校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 17:11
文章分类

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 19:10:51

1 现象:问题描述
广东移动公司动态地带品牌用户,出现用户费用不足的情况下,被错误的开机。
2 关键过程:根本原因分析
用户开机处理判断中,需要判断用户账户当前金额是否大于待扣费用。如果大于,则会进行开机处理。但是广东出现问题的用户,账户费用不足待扣费用。
分析错误的原因,发现账户金额变量与待扣费用变量类型不一致,其中账户金额变量为int,待扣费用为unsigned long。
代码如下:
unsigned long ulNeccesaryFee;

if( ValidAcctLeft(updBasetab_pps, False) > ulNeccesaryFee )
{
    开机处理;
}
ValidAcctLeft()函数返回为int类型数,而ulNeccesaryFee为unsigned long类型。unix下对于这样的语句,结果是错误的:
int a = -1;
unsigned long b = 0;
if (a > b)
{
    printf("a > b");
}
else
{
    printf("a <= b");
}
对于这样的语句,比较出来的结果是a > b
编译器先将a转换为unsigned long类型,再与b比较,则负数就变为了正数,从而导致比较错误。
3 结论:解决方案及效果
修改ulNeccesaryFee变量类型为int类型,如下:
int ulNeccesaryFee;

if( ValidAcctLeft(updBasetab_pps, False) > ulNeccesaryFee )
{
    开机处理;
}
4 经验总结:预防措施和规范建议
不同类型数据比较时,需要注意隐形转换导致的问题,比如溢出、编译器的隐含转换等。
5 备注
N/A
6 考核点
1 不同类型变量的表达范围
2 不同类型变量的类型转换时,会出现什么样的情况
7 试题
1 如下表达式:int a = -100; unsigned int b = 0; a > b? 结果为:( A )
A, true   B, false  C 不确定,与编译器有关 D以上都不对
阅读(290) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~