比较long long和int时溢出的原因

时间:2016-01-10 05:41:12

标签: c++ c

我正在编写像这样的代码

int reverse(int x) {
  long long res;

  ......

  if(x>0&&res>INT_MAX||x<0&&res>INT_MAX+1){
      return 0;
  }
  ......
}

它显示溢出,但当我向其添加转换时,它符合

int reverse(int x) {
  long long res;

  ......

  if(x>0&&res>(unsigned long long)INT_MAX||x<0&&res>(unsigned long long)INT_MAX+1){
      return 0;
  }
  ......
}

有人可以向我解释一下这是什么问题吗?

3 个答案:

答案 0 :(得分:3)

INT_MAX+1被评估为两个int的整数加法。由于结果不是可以表示为int的值范围,因此您会看到溢出。

(unsigned long long)INT_MAX+1被评估为两个unsigned long long的整数加法。由于运算符的两边和结果都在可以表示为unsigned long long的值范围内,因此没有溢出。

答案 1 :(得分:2)

INT_MAX + 1

在这个子表达式中,+的两个操作数的类型都是int,因此结果的类型是int,导致整数溢出。

但是,如果将一个操作数强制转换为unsigned long long

(unsigned long long)INT_MAX + 1

unsigned long long的结果类型,因此没有溢出,就像那样简单。

答案 2 :(得分:-1)

触发溢出的是表达式

INT_MAX+1

因为INT_MAX的类型是int(32位整数),所以INT_MAX + 1超过了int的最大值。 一旦将其转换为无符号长整数(64位整数),

(unsigned long long)INT_MAX

现在远低于其类型的最大值,

(unsigned long long)INT_MAX + 1

有效