logo

C/C++ 및 애플리케이션의 INT_MAX 및 INT_MIN

대부분의 경우 경쟁 프로그래밍에서는 데이터 유형이 가질 수 있는 최대값 또는 최소값인 변수를 할당해야 하는데, 이렇게 크고 정확한 숫자를 기억하는 것은 어려운 일이 됩니다. 따라서 C/C++에는 이러한 숫자를 나타내는 특정 매크로가 있으므로 실제로 전체 숫자를 입력하지 않고도 변수에 직접 할당할 수 있습니다.

C/C++는 정수 한계를 나타내는 INT_MAX 및 INT_MIN이라는 두 가지 매크로를 제공합니다. 컴파일러 및 C++ 표준에 따라 헤더 파일을 포함해야 할 수도 있습니다. 또는 C 또는 C++ 소스 코드에서 각각. 따라서 INT_MAX 및 INT_MIN 매크로를 사용하려면 이 헤더 파일을 포함하는 것이 좋습니다. 이 헤더 파일에 대해 더 자세히 알아보려면 이 글을 참고하세요 .



C/C++의 INT_MAX

INT_MAX는 정수 변수가 이 제한을 초과하는 값을 저장할 수 없음을 지정하는 매크로입니다. 그것은 상한의 최대값 C/C++의 정수 데이터 유형입니다.

INT_MAX의 값은 다음과 같습니다.

자바 카운터
  • INT_MAX = 2147483647 (32비트 정수의 경우)
  • INT_MAX = 9,223,372,036,854,775,807 (64비트 정수의 경우)

C/C++의 INT_MIN

INT_MIN은 정수 변수가 이 제한보다 낮은 값을 저장할 수 없음을 지정하는 매크로입니다. 그것은 최소값 또는 하한 정수 데이터 유형입니다.



INT_MIN의 값은 다음과 같습니다.

  • INT_MIN = – 2147483648 (32비트 정수의 경우)
  • INT_MIN = – 9,223,372,036,854,775,808 (64비트 정수의 경우)

메모: INT_MAX 및 INT_MIN 값은 컴파일러마다 다를 수 있습니다. 다음은 정수가 32비트를 사용하여 저장되는 컴파일러의 일반적인 값입니다.

J E S T

INT_MIN 및 INT_MAX의 예

C++
// C++ program to print values of INT_MAX // and INT_MIN #include  #include  using namespace std; int main() {  cout << INT_MAX << endl;  cout << INT_MIN;  return 0; }>
// C program to print values of INT_MAX // and INT_MIN // we have to include limits.h for results in C #include  #include  int main() {  printf('%d
', INT_MAX);  printf('%d', INT_MIN); }>

산출
2147483647 -2147483648>

INT_MAX 및 INT_MIN의 응용

다음은 INT_MAX 및 INT_MIN의 주요 응용 프로그램입니다.



1. 정수 오버플로 확인

INT_MIN 및 INT_MAX 매크로를 사용하여 부호 있는 정수 오버플로를 확인할 수 있습니다. 아래 예에서는 이를 수행하는 방법을 보여줍니다.

C++
// C++ code to check for Integer overflow while // adding 2 numbers #include  #include  using namespace std; // Function to return integer sum after checking overflow int check_overflow(int num1, int num2) {  // Checking if addition will cause overflow  if (num1>INT_MAX - 숫자 2) -1을 반환합니다.  // 오버플로가 발생하지 않았으면 num1 + num2를 반환합니다. } // 드라이버 코드 int main() { // 이 숫자의 합은 INT_MAX와 같습니다. // 그 중 하나라도 1씩 증가하면 오버플로가 발생합니다. // int num1 = 2147483627;  int num2 = 20;  // 오버플로가 발생하면 결과는 -1입니다. // 합계를 저장하고, 그렇지 않으면 int result = check_overflow(num1, num2);  // 오버플로가 발생했습니다. if (result == -1) cout<< 'Integer overflow occurred';  // No overflow  else  cout << result;  return 0; }>
// C code to check for Integer overflow while // adding 2 numbers #include  #include  // Function to check integer overflow int check_overflow(int num1, int num2) {  // Checking if addition will cause overflow  if (num1>INT_MAX - 숫자 2) -1을 반환합니다.  // 오버플로가 발생하지 않았으면 num1 + num2를 반환합니다. } int main(void) { // 이 숫자의 합은 // INT_MAX와 동일합니다. 이 중 하나라도 1씩 증가하면 오버플로가 발생합니다. // int num1 = 2147483627;  int num2 = 20;  // 오버플로가 발생하면 결과는 -1입니다. // 합계를 저장하고, 그렇지 않으면 int result = check_overflow(num1, num2);  // 오버플로가 발생했습니다. if (결과 == -1) printf('정수 오버플로가 발생했습니다');  // 오버플로 없음 printf('%d', result);  0을 반환합니다. } // 이 코드는 sarajadhav12052009가 제공한 것입니다.>

산출
2147483647>

마찬가지로 INT_MIN을 사용하여 2개의 숫자를 빼는 동안 오버플로를 확인할 수 있습니다.

2. 큰 요소가 있는 배열에서 MIN 계산

일반적으로 배열의 최소값을 계산하기 위해 MIN에 높은 값을 할당합니다. 그러나 배열에 큰 요소가 있는 경우 배열에 가능한 가장 높은 값을 할당해야 합니다.

구현은 다음과 같습니다.

C++
// C++ code to compute MIN element #include  #include  using namespace std; // Function to compute minimum element in array int compute_min(int arr[], int n) {  // Assigning highest value  int MIN = INT_MAX;  // Traversing and updating MIN  for (int i = 0; i < n; i++)  MIN = std::min(MIN, arr[i]);  // Printing MIN element  cout << MIN; } // Driver code int main() {  // array with MIN to compute  int arr[] = { 2019403813, 2147389580, 2145837140,  2108938594, 2112076334 };  // size of array  int n = sizeof(arr) / sizeof(arr[0]);  // Function call to compute MIN  compute_min(arr, n); }>

산출
2019403813>

마찬가지로 MAX는 INT_MIN을 사용하여 큰 숫자 배열에서 찾을 수 있습니다.

INT_MIN 및 INT_MAX에 대한 FAQ

1. 왜 abs(INT_MIN)이 예상한 결과를 제공하지 않습니까?

abs() 함수를 사용했을 때 문제에 직면한 적이 있습니까? 절대 함수가 필요한 문제를 해결하지 못했다면 아마도 아니요일 것입니다. 그러나 techcodeview.com 또는 Leetcode에서 문제를 해결했다면 항상 실패하는 테스트 사례가 하나 있고 해당 테스트 사례는 값이 INT_MIN인 경우라는 것을 알 수 있습니다.

절대 함수를 사용하면 mod 값을 반환하는데, 이는 다음 값을 반환한다는 의미입니다.

리눅스 디렉토리 이름 변경

모듈러스 값

이제 우리가 아는 또 다른 사실은 정수의 범위가 -2,147,483,648부터 2,147,483,647까지라는 것입니다. -2 31 2로 31 - 1 그래서 우리가 볼 수 있듯이 항상 긍정적인 면보다 부정적인 면이 더 많습니다.

자바의 반환 유형

이제 결과의 절대값을 취하려고 하면 어떤 일이 발생하는지 살펴보겠습니다.

C++
// C++ program to demonstrate the common error faced when // getting absolute value of the INT_MIN #include  #include  using namespace std; int main() {  cout << 'Value Of INT_MIN is : ' << INT_MIN << endl;  cout << 'Value Of abs(INT_MIN) is : ' << abs(INT_MIN)  << endl;  return 0; }>
// C program to demonstrate the common error faced when // getting absolute value of the INT_MIN #include  #include  #include  int main() {  printf('Value of INT_MIN is: %d
', INT_MIN);  printf('Value of abs(INT_MIN) is: %d', abs(INT_MIN));  return 0; }>

산출
Value of INT_MIN is: -2147483648 Value of abs(INT_MIN) is: -2147483648>

이제 우리는 abs(INT_MIN)이 INT_MIN 자체임을 관찰할 수 있으며 이로 인해 온라인 평가를 제공하거나 문제를 해결할 때 많은 오류가 발생합니다.

이유

이제 이유 부분으로 가면 현재 정수 부분을 다루고 있으며 abs(integer)가 정수 값 자체를 반환하므로 INT_MIN 표현 옆으로 이동하는 것은 다음과 같이 나타낼 수 있습니다.

INT_MIN = -2147483648 = 10000000000000000000000000000000>

여기서 첫 번째 비트는 음수임을 의미하는 1로 설정된 부호 비트를 나타내고 다음 부분은 2147483648에 대한 31비트 이진 표현입니다.

이제 INT_MIN의 절대값을 취하려고 하면 +2147483648을 제공하려고 시도하며 이 값은 정수 형식으로 표시할 수 없습니다. 표현할 수 있는 최대값은 +2147483647입니다. 231개의 정수를 나타내지만 0도 포함되므로 1부터 2147483648까지의 범위는 0부터 2147483647까지 변경됩니다. 이러한 이유로 이 범위에서는 ABS(INT_MIN)를 표현할 수 없으며 반환된 대답은 INT_MIN과 동일합니다.

해결책

문제에 대한 해결책은 다양할 수 있지만 가장 좋은 해결책은 다음과 같습니다.

  1. abs(x)를 사용하는 경우 if(x == INT_MIN) 확인을 위해 항상 특수한 경우를 사용하고 이에 따라 이 경우를 처리하십시오.
  2. INTEGER 대신 Long을 사용해 보세요. 하지만 LONG_MIN도 동일한 결과를 제공하므로 주의하세요.