INT_MAX 的比较

时间:2021-02-24 10:50:40

标签: c++

我尝试比较两个 INT_MAX,然后将这个结果与一个整数进行比较,得到了这个奇怪的结果。你能解释一下为什么会这样吗?

#include <iostream>
#include <climits>
#include <bits/stdc++.h>
using namespace std;
  int main() {
    // your code goes here
    int a = 2;
    int option1 = min(INT_MAX, 1+INT_MAX);
    cout << "Result 1 " << option1 << endl;
    cout << "Result 2" << min(option1, 1+a);
    return 0;
}

它给出了这个输出:

Output:
    Result 1 -2147483648
    Result 2-2147483648

根据我的说法,结果 2 应该是 3,但它给出了其他东西。我不明白这种不同输出背后的原因。

2 个答案:

答案 0 :(得分:3)

这溢出了

int option1 = min(INT_MAX, 1+INT_MAX);

INT_MAX(或更好:std::numeric_limits<int>::max())的目的是,作为最大 int 值的常量,该值可以用 int 的字节数表示{1}} 在您的系统上。如果将 1 添加到它,这是一个有符号整数溢出。

有符号整数溢出会导致未定义的行为。您无法真正推断程序的输出,因为任何事情都可能发生。请注意,正如@Thomas 和@largest_prime_is_463035818 在评论中指出的那样,无符号整数溢出不是 UB,而是环绕。

答案 1 :(得分:1)

INT_MAX 是您可以存储在(有符号)int 中的最大正值,当您将其加 1 时,您会得到 undefined behavior。不过,这并不奇怪,因为 (unsigned int) 0x7FFFFFFF + 1 == 0x80000000 是二进制补码中的值 -2147483648。现在,您将一个大的负数与 3 进行比较,并得到符合预期的大负值。

相关问题