前言
今天在洛谷上做一道题,题目不算难,但是有一个测试点一直是runtime error,大概就是程序崩溃导致的,但是我一直没找到原因,而又暂时不能把测试点数据下载下来,因为24小时内只能下载一次…后来终于等到可以下载了,调试之后发现是有两个unsigned int型数据相减导致溢出的问题。害~
正题
unsigned int的最小值为0,运算中低于0就会溢出,如同int型低于-2147483648就会溢出一样,溢出后成为正向最大值,这样会让程序运行产生不可预知的错误。因此unsigned int型数据作差时需要谨慎,如a、b都是unsigned int型数据,那么计算a-b
当a<b
时就会发生溢出。一种很容易发生的情况,也就是我上面提到的所遇到的情况:C++ STL容器都有一个size()成员函数,该函数的返回值都为unsigned int型,如果稍不注意用两个容器的size()返回值作差,那么可能导致溢出。
解决方法:(1)使用条件判断语句 c=a>b?a-b:b-a;
(2)在不会导致数据丢失的情况下,进行强制类型转换。