在c中的反向整数给出了溢出值

我在用c语言的leetcode解决反向整数问题,但在sum=sum+rem*10;这一行出现了运行时错误。

runtime error: signed integer overflow: 964632435 * 10 cannot be represented in type 'int'

下面是代码。

#define INT_MAX 2147483647
#define INT_MIN -2147483648

int reverse(int x){
    int sum=0,rem=0;
    int p;
    if(x > INT_MAX || x < INT_MIN){return 0;}
    if(x==0){return 0;}
    if(x<0){p=x;x=abs(x);}
    while(x%10==0){x=x/10;}

    while(x>0){
        rem=x%10;

        if(sum > INT_MAX || sum*(-1) < INT_MIN){return 0;}        
        sum=sum*10+rem;

        x/=10;
    }
    if(p<0){sum=sum*(-1);return sum;}
    else{return sum;}
}

解决方案:

但在行 sum=sum+rem*10;上给出了运行时错误。

为了测试潜在的 int 溢出 sum, rem比较 INT_MAX/10INT_MAX%10 事前。

    if (sum >= INT_MAX / 10 && (sum > INT_MAX / 10 || rem > INT_MAX % 10)) {
      // overflow
    } else {
      sum = sum * 10 + rem;
    }

处理底片

小心 x = INT_MINx = -x;. 那就是 int 溢出和 未定义行为.

有时候,解决这样的问题很有趣 int 正负数转换问题 弃暗投明 – 它是你唯一的希望。(狂笑)

还有更多 int 小于零的值比有 int 值大于零–1。 所以 x = -x 始终是定义明确的,当 x > 0.

// C99 or later code
#include <limits.h>

int reverse(int x) {
  int x0 = x;
  if (x0 > 0) {
    x = -x;  // make positive values negative, embrace the dark side
  }
  int reversed = 0;

  while (x < 0) {
    int rem = x % 10;
    x /= 10;
    if (reversed <= INT_MIN / 10
        && (reversed < INT_MIN / 10 || rem < INT_MIN % 10)) {
      // overflow
      return 0;
    }
    reversed = reversed * 10 + rem;
  }

  if (x0 > 0) {
    if (reversed < -INT_MAX) {
      // overflow
      return 0;
    }
    reversed = -reversed;
  }
  return reversed;
}

测试代码

#include <stdio.h>

int main() {
  int x[] = {0, 1, -1, 42, 123456789, INT_MAX/10*10+1, INT_MIN/10*10-1,INT_MAX, INT_MIN};
  size_t n = sizeof x / sizeof x[0];
  for (size_t i = 0; i < n; i++) {
    printf("Attempting to reverse %11d ", x[i]);
    printf("Result %11d\n", reverse(x[i]));
  }
}

样品输出

Attempting to reverse           0 Result           0
Attempting to reverse           1 Result           1
Attempting to reverse          -1 Result          -1
Attempting to reverse          42 Result          24
Attempting to reverse   123456789 Result   987654321
Attempting to reverse  2147483641 Result  1463847412
Attempting to reverse -2147483641 Result -1463847412
Attempting to reverse  2147483647 Result           0
Attempting to reverse -2147483648 Result           0

给TA打赏
共{{data.count}}人
人已打赏
未分类

在Firebase上更改URL?

2022-9-9 7:09:25

未分类

PHP。星级评定系统概念?[关闭]

2022-9-9 7:20:16

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索