浅谈防不胜防的unsigned int的运算

 更新时间:2016年12月21日 09:06:55   投稿:jingxian  
下面小编就为大家带来一篇浅谈防不胜防的unsigned int的运算。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

我很早之前就知道,unsigned int与int运算的时候,int会被转化为unsigned int来进行运算。一直觉得定这条规则的人是极度反人类的,虽说unsigned int可以表示更大的正值,但毕竟我们不太会把unsinged想像成一个负数,而一个负的int数可能在无意间就变成了最大的正数。

所以,我对这个问题很慎重。小心翼翼地,一直没怎么出过错。直到有一天。

第一回合

那是一个阳光明媚的午后,我正惬意地刷leetcode。要遍历vector中除最后一个元素的所有元素。我这样写道:

for(int i=0;i<nums.size()-1;++i)
  bulabula;

没什么错吧?没错!提交的时候发现程序出现了内存访问错误。

作为一个自信的程序员,我自然想到了编译器出了问题。于是在VS上测试,是没有问题的!Stupid Leetcode!居然说我的代码有问题,我的代码怎么可能有问题?

就在我要放弃这一题的时候,我突然想到了边界条件,于是把nums清空再测试,VS提示内存访问错误。Soryy Leetcode,是在下输了……

在进行一番绞尽脑汁之后,我把目光聚焦在了size_t,查了资料后发现,size_t就是个unsigned类型,恍然大悟……nums.size()-1就等于最大的正数,i与之比较,肯定是符合条件的!OH NO!

第二回合

在经历了上述事情之后,我一般会这么写程序:

for(int i=0;i<(int)nums.size()-1;++i)
  bulabula;

再也没有出现过问题。每次看到别人还写我之前那样的代码,我都会会意一笑,然后告诉他人的我心得。直到有一天,我看到一个大牛写了这样的代码:

for(int i=nums.size()-1;i>=0;--i)
  bulabula;

我想我发现了大牛的错误。有了上次的教训,这次我测试了一下边界条件。什么?居然正常运行?

在想了很久之后,我得出以下结论:nums.size()-1的确得到了一个最大的unsigned int,可是把它赋给int的时候,编译器就傻傻地直接把unsigned int赋给了int,于是int就为-1了。大牛毕竟是大牛……

在学知识的道路上总会有羊肠小道,多走一些羊肠小道,我才能知道有没有近道!加油加油!

以上就是小编为大家带来的浅谈防不胜防的unsigned int的运算全部内容了,希望大家多多支持脚本之家~

相关文章

  • C++实现inline hook的原理及应用实例

    C++实现inline hook的原理及应用实例

    这篇文章主要介绍了C++实现inline hook的原理及应用,需要的朋友可以参考下
    2014-08-08
  • C语言程序设计第五版谭浩强课后答案(第二章答案)

    C语言程序设计第五版谭浩强课后答案(第二章答案)

    这篇文章主要介绍了C语言程序设计第五版谭浩强课后答案(第二章答案),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-04-04
  • C语言数据结构系列队列篇

    C语言数据结构系列队列篇

    本章我们将学习 "队列" ,首先介绍队列的概念和结构,然后我们将着重讲解栈的实现。我们从零开始写队列的接口,并从零开始步步解读。本章将继续巩固画思路草图的能力,只要思路草图画好了,就可以很轻松地将其转换成代码
    2022-02-02
  • QT中QDockWidget控件的使用小结

    QT中QDockWidget控件的使用小结

    QDockWidget类提供了一个小部件,可以停靠在QMainWindow中,也可以作为桌面上的顶级窗口浮动,本文主要介绍了QT中QDockWidget控件的使用小结,感兴趣的可以了解一下
    2024-01-01
  • C++排序算法之插入排序解析

    C++排序算法之插入排序解析

    这篇文章主要介绍了C++排序算法之插入排序解析,将数组分为有序表和无序表,每次从有序表中取出一个元素,插入到有序表的适当位置,每遍历一次,有序表中元素增加一个,无序表中元素个数减少一个,重复n-1次,完成排序,需要的朋友可以参考下
    2023-10-10
  • C语言实现扫雷游戏详细流程

    C语言实现扫雷游戏详细流程

    windows自带的游戏《扫雷》是陪伴了无数人的经典游戏,本文将利用C语言实现这一经典的游戏,文中的示例代码讲解详细,感兴趣的可以学习一下
    2022-05-05
  • C++ Array容器的显示和隐式实例化详细介绍

    C++ Array容器的显示和隐式实例化详细介绍

    这篇文章主要介绍了C++中Array容器的隐式实例化和显式实例化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • C++线程安全的队列你了解嘛

    C++线程安全的队列你了解嘛

    这篇文章主要为大家详细介绍了C++线程安全的队列,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++的类型转换详细介绍

    C++的类型转换详细介绍

    这篇文章主要介绍了C++的类型转换详细介绍的相关资料,需要的朋友可以参考下
    2017-06-06
  • notepad介绍及插件cmake编译过程(替代notepad++)

    notepad介绍及插件cmake编译过程(替代notepad++)

    这篇文章主要介绍了notepad介绍及插件cmake编译过程(替代notepad++),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03

最新评论