小心陷阱--% of C

今天跑单元测试,发现一个内存非法访问。开始以为是某些逻辑有错误,一直在看是不是哪里越界操作了。后来还是T同志比较快发现了,原来是一个类型转换出现的问题:在形如a[func())]的数组访问中,func()得到的竟然是个负数。而func的最后返回值,是形如 return (int)uiVar1 %  iVar2 这样一个表达式。其中uiVar1是unsigned int型,iVar2是int型。之所以把iVar1转成有符号int,是因为uiVar1 % iVar2会产生PC-LINT告警,提示为混合符号类型的除法。显式转换是为了消除告警。

我开始怎么也想不到这个竟然会产生负数。因为在数学上,余数都是正的。后来经过我们的实验,并查阅了MSDN,原来%运算的符号,是和编译器有关的!真是危险啊。MS-C里面,求余的结果的符号,是和被除数一致的。把uiVar1转成int时,有可能成为了负数,于是整个返回值就是个负数了。

经过修改,代码变成return (int)(uiVar1 % (unsigned)iVar2),错误消除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值