首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在一些C++编译器中,‘in = 2147483647+1;`只给出一个警告而存储一个负值,而一些编译器则给出一个运行时错误?

为什么在一些C++编译器中,‘in = 2147483647+1;`只给出一个警告而存储一个负值,而一些编译器则给出一个运行时错误?
EN

Stack Overflow用户
提问于 2022-06-13 01:09:36
回答 1查看 187关注 0票数 2

我想检查签名的intx的反向是否位于INT_MAXINT_MIN中。为此,我反转了两次x,并检查它是否等于原始的x,如果是,那么它位于INT_MAXINT_MIN中,否则就不会。

但是在线编译器给出了一个运行时错误,但是我的g++编译器工作正常,并给出了正确的输出。有人能告诉我原因吗?

代码语言:javascript
复制
   int reverse(int x) {
        int tx=x,rx=0,ans;
        while(tx!=0){
            rx = rx+rx+rx+rx+rx+rx+rx+rx+rx+rx+tx%10;
            tx/=10;
        }
        
        ans = tx = rx;
        rx=0;
        
        while(tx!=0){
            rx = rx*10 + tx%10;
            tx/=10;
        }
        
        while(x%10==0&&x!=0)x/=10;
        //triming trailing zeros
        
        if(rx!=x){
            return 0;
        }else{
            return ans;
        }
      
        
    }

错误:

代码语言:javascript
复制
Line 6: Char 23: runtime error: signed integer overflow: 1929264870 + 964632435 cannot be represented in type 'int' (solution.cpp)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:15:23
EN

回答 1

Stack Overflow用户

发布于 2022-06-13 02:48:32

我不知道你的算法出了什么问题,但让我提出一个替代方案,避免做数学运算,避免整数溢出的可能性。

如果您想要找到If,比方说,当反转时2147483641是一个有效的整数(例如,1463847412),那么在将初始值转换为字符串并反转该字符串之后,您完全可以作为字符串进行比较。

一个非负值的基本算法它如下:

  • 将整数转换为字符串(让我们将此字符串称为s)
  • 将INT_MAX转换为字符串(让我们调用这个字符串max_s)
  • 反向s.适当处理前导零和负值字符。即,120反转为"21“,-456反转为"-654”。此转换的结果是一个名为rev的字符串。
  • 如果是rev.length() < s_max.length(),那么rev作为整数是有效的。
  • 如果为rev.length() > s_max.length(),则rev作为整数无效。
  • 如果是rev.size() == s_max.length(),则反向字符串与INT_MAX的长度与字符串相同。词汇比较就足以判断它是否有效。那是isValid = (rev <= s_max)isValid = strcmp(rev, s_max) < 1

除将INT_MAX替换为INT_MIN外,负值算法是相同的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72596915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档