HOWTO · C++

C++의 INT_MAX 및 INT_MIN 매크로 식

이 기사에서는 C++에서 INT_MAX 및 INT_MIN 매크로 표현식을 활용하는 방법을 소개합니다.

이 페이지의 내용

INT_MIN과 INT_MAX는 구현에서 int 형식으로 표현할 수 있는 가장 작은 값과 가장 큰 값입니다. C++에서 이 매크로를 사용하려면 <climits>를 포함하세요. 값은 구현에 따라 달라지므로 특정 플랫폼의 숫자를 가정하지 말고 직접 확인해야 합니다.

C++에서 INT_MIN과 INT_MAX의 의미

두 매크로는 int의 범위를 나타냅니다. INT_MIN은 하한이고 INT_MAX는 상한입니다. 범위는 C++ 구현에 따라 정해지므로 모든 컴퓨터에서 같은 숫자를 사용한다고 보장되지 않습니다. 이 매크로는 int에 적용되며 long, short 또는 부호 없는 정수 형식의 범위를 나타내지는 않습니다. 해당 형식의 범위가 필요하다면 <climits> 헤더에서 LONG_MIN, LONG_MAX, UINT_MAX와 같은 관련 매크로도 사용할 수 있습니다.

이 매크로를 사용하면 코드에서 구현이 정한 실제 한계값을 참조할 수 있습니다. 비교식이나 범위 정의에 익숙한 10진수 값을 직접 넣는 것보다 이식성이 좋습니다. 매크로는 경계값을 알려 줄 뿐, 그 자체로 산술 연산을 안전하게 만들지는 않습니다.

<climits>로 정수 한계값 확인하기

정수 한계 매크로를 사용하려면 <climits>를 포함하세요. 다음 전체 예제는 특정 10진수 값을 가정하지 않고 int의 두 경계값을 출력합니다.

다음 예제를 실행해 보세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

#include <climits>
#include <iostream>

int main() {
  std::cout << "INT_MIN = " << INT_MIN << '\n';
  std::cout << "INT_MAX = " << INT_MAX << '\n';
}
INT_MIN = -2147483648
INT_MAX = 2147483647

다음은 테스트한 환경에서 확인된 값입니다. 사용하는 구현에서는 다른 한계값이 출력될 수 있습니다. 다른 정수 형식의 한계값이 필요하면 int의 경계값을 재사용하지 말고 <climits>에 있는 해당 형식의 매크로를 사용하세요.

전체 범위에서 무작위 int 생성하기

std::uniform_int_distribution<int>는 하한과 상한을 모두 포함하는 범위를 받습니다. 따라서 INT_MIN과 INT_MAX를 전달하면 int의 전체 범위에서 값을 생성하도록 요청합니다. 난수 엔진이 수열을 제공하고, 분포 객체가 엔진의 결과를 요청한 범위에 대응시킵니다.

다음 예제를 실행해 보세요.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

#include <climits>
#include <iostream>
#include <random>

int main() {
  std::mt19937 engine(42);
  std::uniform_int_distribution<int> distribution(INT_MIN, INT_MAX);

  for (int count = 0; count < 5; ++count) {
    std::cout << distribution(engine) << '\n';
  }
}
-538846106
1273642419
1935803228
-1359637234
996406378

다음은 테스트한 환경에서 관찰된 출력입니다. 고정 시드를 사용하면 엔진의 시작 상태를 반복할 수 있지만, 분포 알고리즘이 어디서나 동일한 수열을 생성해야 하는 것은 아니므로 표준 라이브러리 구현에 따라 정확한 분포 값은 달라질 수 있습니다. 애플리케이션에 비결정적 시드가 필요하다면 적절한 출처에서 엔진을 시드하세요. 값을 뽑을 때마다 새 엔진을 만들지는 마세요.

정수 한계값을 안전하게 사용하기

한계 매크로는 값을 검증하거나 허용 범위를 표현할 때 유용하지만, 오버플로가 발생한 뒤 결과를 확인하면 이미 늦습니다. 음이 아닌 int 값의 덧셈에서는 a + b를 계산하기 전에 a <= INT_MAX - b인지 확인하세요. 뺄셈은 계산 전에 하한과 상한을 고려해야 합니다. 범위가 비대칭인 구현에서는 INT_MIN을 부정한 값이 int로 표현되지 않습니다. C++에서 부호 있는 정수 오버플로는 정의되지 않은 동작이므로, 오버플로가 다른 값으로 순환한다고 가정하지 마세요.

계산 결과가 int의 범위를 벗어날 수 있다면 범위가 충분한 형식을 선택하거나 연산 전에 오버플로를 검사하세요. 더 넓은 형식도 해당 계산 결과를 담기에 충분해야 합니다. INT_MIN과 INT_MAX는 테스트와 경계 검사에 유용하지만, 산술 연산 전에 입력을 검사하는 로직이 없다면 오버플로를 막아 주지 않습니다.