注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

hhfighting的博客

以责人之心责己,以恕己之心恕人

 
 
 

日志

 
 
 
 

unsigned int 与int混用导致的问题  

2014-10-05 05:26:08|  分类: C & C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
程序中经常提示很多warning(由于自己定义的变量通常用int,但是使用别的库函数经常用size_type为unsigned int),每次编译看到觉得很碍眼,但是碍于程序过大(几十个文件,担心改了会出问题),前段时间觉得实在无法忍受这么warning,于是下定决心改进一下,刚改完很是兴奋,终于warning say goodbye。由于程序涉及到多个子程序,起初只运行了一部分,没发现任何错误。但是最近两天视图运行整个程序,总是自动退出,找了两天的原因,竟然发现是忽视了unsigned int和int之间相互转换及比较大小的问题。
问题1:
unsigned int num,i;
if((num-i)<=0)
      num=0;
else
     num=num-i;
这样做期望的结果是保证num一定为正数,因为这个变量将被用为数组下标。printf(%d)这个值竟然发现是一个负数,这下才意识到num-i是以无符号int被编译器所解释的,因此if条件永远不满足,因此得到的num如果以%d形式输出应该是个负数,以%ud应该是个很大的数。
解决方法是:
 int temp=num-i;
 if(temp<=0)
      num=0;
else
     num=num-i;
问题2:
for(unsigned int i =*.size()-1; i>=0; i--){...}
问题:循环不会退出。
解决方法:
for(unsigned int i =*.size()-1; i>=0; i--){...}
教训:使用unsigned int的时候一定要小心。
记录一些相关的知识点:
(1)内存中负数的存储方式是:相应正数的反码+1
(2)unsigned int和int数据运算后会默认转换为unsigned int进行运算,结果也是unsigned int。
  评论这张
 
阅读(41)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017