注意int类型数据相加的溢出

博客讨论了在C++编程中遇到的整数溢出问题,特别是在处理力扣228题时的一个具体例子。文章解释了如何在计算过程中导致整数溢出,并提出了解决方案,即先计算增量再加到原始值上,以避免溢出。博主还深入探讨了int类型的存储机制和二进制补码表示,以解释溢出的原因及防止方法。
摘要由CSDN通过智能技术生成

1、在想不到的地方出了int相加溢出的错误。

在做力扣228. 汇总区间时,出现了这个错误。
代码如下

class Solution {
public:
    vector<string> summaryRanges(vector<int>& nums) {
         if(!nums.size()) return {};
         vector<string> ans;
         for(int i=0;i<nums.size(); ){
             int temp=nums[i],k=0;
             while(i<nums.size()&&nums[i]==temp+k){
                 i++;
                 k++;
             }
             string str=to_string(temp);
             if(k>1) str+=("->"+to_string(temp+k-1));//第13行
             ans.push_back(str);
         }
         return ans;
    }
};

这份代码,可以通过绝大多数样例。
但是样例[-2147483648,-2147483647,2147483646,2147483647]通不过,这是因为,当i=2时,temp先被赋值为了nums【2】,即2147483646,之后进行while循环,进行2次,就推出了循环,因为此时i已经是nums的最大的数据下标了,此时k被while循环修改为了2,之后在if判断语句中,要加上temp+k-1这个数变成的string,这个思路没有问题,但是,问题出在了数据本身,就是,此时temp已经是2147483646,而int类型的数据的最大值为(1<<31)-1,即十进制的2147483647,当temp先计算temp+k,即temp+2时,溢出了。我们可以修改一下程序,使得temp先计算-1之后再加k,即第13行的代码修改为 if(k>1) str+=("->"+to_string(temp-1+k));
看似没有问题了,但是,问题又来了,还是通不过这个样例,这是因为,此时对于这个样例的后两个数据,这么修改程序之后,是可以通过的,但是前两个数据不可以。仔细分析以下,当i=0时,将temp赋值为nums【0】,即为-2147483648,之后通过一个while循环,将k修改为了2,此时执行到13行的if语句,会发现,是先计算的temp-1。int类型在内存中的存储是4个字节,并且是以二进制的补码形式进行存放的,所以其范围为
FFFFFFFFH—>7FFFFFFFH,也就是-2147483648—>2147483647,当先计算temp-1,时,会下溢。
解决方法为
将k-1打包起来,先计算k-1,即修改为if(k>1) str+=("->"+to_string(temp+(k-1));
此时就可以处理这种极端的例子了。
力扣比pat好在可以看到自己的程序卡在了哪一个样例上。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值