logo

C/C++ とアプリケーションの INT_MAX と INT_MIN

ほとんどの場合、競技プログラミングでは、データ型が保持できる最大値または最小値である変数を割り当てる必要がありますが、そのような大きくて正確な数値を記憶するのは困難な作業です。したがって、C/C++ にはこれらの数値を表す特定のマクロがあり、実際に数値全体を入力しなくても変数に直接割り当てることができます。

C/C++ には、整数の制限を表す INT_MAX と INT_MIN という 2 つのマクロが用意されています。コンパイラと C++ 標準によっては、ヘッダー ファイルをインクルードする必要がある場合があります。 または それぞれ C または C++ ソース コードに含めます。したがって、INT_MAX および INT_MIN マクロを使用するには、このヘッダー ファイルを含めることをお勧めします。このヘッダー ファイルの詳細については、次を参照してください。 この記事を参照してください



C/C++ の INT_MAX

INT_MAX は、整変数がこの制限を超える値を格納できないことを指定するマクロです。それは、 上限の最大値 C/C++ の整数データ型。

INT_MAX の値は次のとおりです。

シナモンvsメイト
  • 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 ビットを使用して整数が格納されるコンパイラの一般的な値です。

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
// 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 マクロを使用して、符号付き整数のオーバーフローをチェックできます。以下の例は、その方法を示しています。

文字を文字列Javaに変換する方法

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 - num2) -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
// 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 - num2) -1 を返します。  // オーバーフローは発生しませんでした。それ以外の場合は、num1 + num2 を返します。 } int main(void) { // これらの数値の合計は // INT_MAX に相当します。いずれか 1 つ増加すると、 // オーバーフローが発生します int num1 = 2147483627;  int num2 = 20;  // オーバーフローが発生した場合、結果は -1 になります。 // 合計を格納します。それ以外の場合、 int result = check_overflow(num1, num2);  // オーバーフローが発生しました if (result == -1) printf('整数オーバーフローが発生しました');  // オーバーフローなし、それ以外の場合 printf('%d', result);  0を返します。 } // このコードは sarajadhav12052009 によって提供されました>>

出力
2147483647>

同様に、INT_MIN を使用して 2 つの数値を減算するときにオーバーフローをチェックできます。

2. 大きな要素を含む配列内の MIN の計算

通常、配列内の最小値を計算するには、MIN に高い値を割り当てます。ただし、配列に大きな要素がある場合は、可能な限り最大の値を配列に割り当てる必要があります。

以下に実装を示します。

データベースJavaに接続する
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>

同様に、INT_MIN を使用すると、大きな数値の配列で MAX を見つけることができます。

INT_MIN と INT_MAX に関する FAQ

1. abs(INT_MIN) が期待した結果を与えないのはなぜですか?

abs() 関数を使用したときに問題に直面したことはありますか?絶対関数を必要とする問題をまだ解決していない場合は、おそらく NO です。しかし、techcodeview.com または Leetcode の問題を解決したことがある場合は、失敗するテスト ケースが常に 1 つあり、そのテスト ケースは値が INT_MIN の場合であることがわかります。

絶対関数を使用すると何が起こるか見てみましょう。mod 値を返します。つまり、次の値を返します。

モジュラス値

もう 1 つわかっていることは、整数の範囲は -2,147,483,648 から 2,147,483,647 までである、または、それが からであると言えることです。 -2 31 2へ 31 - 1 あることがわかるように、 常にプラス側よりマイナス側に 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
// 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 を使用しても同じ結果が得られるので注意してください。