intの最大値


177

Integer.MaxValueJavaのC / C ++のような関数で(コンパイラに従って)整数の最大値を見つけるコードはありますか?


1
long long intの最大値を見つける方法はありますか?
d3vdpro 2009

単にGregoriesで置き換えintlong long intください...
Georg Fritzsche

1
それは長い長いC ++の一部ではありませんを除いて


@ニール、そう、そのC99-しかしVCとGCC(なし-pedantic)はそれをサポートしています。
Georg Fritzsche、

回答:


323

C ++の場合:

#include <limits>

次に使用します

int imin = std::numeric_limits<int>::min(); // minimum value
int imax = std::numeric_limits<int>::max();

std::numeric_limits 他のタイプでインスタンス化できるテンプレートタイプです。

float fmin = std::numeric_limits<float>::min(); // minimum positive value
float fmax = std::numeric_limits<float>::max();

C:

#include <limits.h>

次に使用します

int imin = INT_MIN; // minimum value
int imax = INT_MAX;

または

#include <float.h>

float fmin = FLT_MIN;  // minimum positive value
double dmin = DBL_MIN; // minimum positive value

float fmax = FLT_MAX;
double dmax = DBL_MAX;

13
浮動小数点minの最小値であり、整数minは最小値であることに注意してください。Cマクロ/定数についても同様です。
ダレ

4
C99では、UINT64_MAXおよびINT64_MAXを使用することもできます
Dmitry Vyal

3
@DmitryVyal:はい、できますが、これらはuint64_tおよびの制限でありint64_t、の制限ではありませんint
キーストンプソン

C ++では、上記と同じコードを使用しました:#include <limits>およびint imax = std::numeric_limits<int>::max();、エラーが発生しますCan't resolve struct member 'max'。これが発生する理由と、それを修正する方法についてのアイデアはありますか?私はCLake IDEを使用しており、Ubuntu 14.04でCMakeおよびC ++ 11を使用しています。この問題に
modulitos 2014年

1
最新のCLion(ビルド138.2344-CLionはEarly Access Programフェーズにあるため不安定です)を使用して修正したのはCLion IDEのバグだったので、これが誰かに役立つことを願っています
modulitos

30

私はそれが古い質問であることを知っていますが、多分誰かがこの解決策を使うことができます:

int size = 0; // Fill all bits with zero (0)
size = ~size; // Negate all bits, thus all bits are set to one (1)

これまでのところ、私たちは持っている-1結果として「までのサイズの符号付き整数です。

size = (unsigned int)size >> 1; // Shift the bits of size one position to the right.

スタンダードが言うように、シフトインされるビットは、変数が符号付きで負の場合は1、変数が符号なしまたは符号付きで正の場合は0です。

通りのサイズが署名され、我々はunsigned int型にキャストしてさせながら負我々は0に符号ビットを設定して、代わりに0にシフトするために、強制的に、あまり役立っていない1、ある符号ビットにシフトする他のすべてのビットが1のまま。

cout << size << endl; // Prints out size which is now set to maximum positive value.

マスクとxorを使用することもできますが、その場合、変数の正確なビットサイズを知る必要がありました。ビットを前にシフトすることで、マシンまたはコンパイラにintが何ビットあるかをいつでも知る必要がなく、追加のライブラリを含める必要もありません。


1
cout << "INT_MAX:\t" << (int) ((~((unsigned int) 0)) >> 1) << '\n' << "UINT_MAX:\t" << ~((unsigned int) 0) << endl;
Slaiyer 2017年

15
#include <climits>
#include <iostream>
using namespace std;

int main() {
  cout << INT_MAX << endl;
}

1
INT_MAXを「Cのソリューション」とは呼びません。ただし、これは古風で、C ++では非推奨です。
Paul Tomblin、

6
どちらもC ++の答えだと思います。numeric_limits<int>::max()-テンプレートコンテキストでも機能しますが、(私には不可解な理由で)コンパイル時の定数として使用できません。INT_MAX-マクロであり、テンプレート関数内ではほとんど役に立ちませんが、コンパイル時の定数として使用できます。
UncleBens 2009

17
面白いことに、msvcのnumeric_limits <int> :: max実装は次のようになります。return(INT_MAX);
NikolaSmiljanić

13
@paul非推奨のリファレンス。そして、numeric_limitsがmax()を実装する方法を推測しますか?そうです、少なくともGCC 4.4.0では「INT_MAXを返す」。

2
@UncleBens:現在、インライン関数を定数式に還元することはできません。
Georg Fritzsche、

1

これは私が使用する符号付き整数の最大値を取得するために使用するマクロです。これは、使用される符号付き整数型のサイズとは無関係であり、gcc -Woverflowが文句を言わないものです。

#define SIGNED_MAX(x) (~(-1 << (sizeof(x) * 8 - 1)))

int a = SIGNED_MAX(a);
long b = SIGNED_MAX(b);
char c = SIGNED_MAX(c); /* if char is signed for this target */
short d = SIGNED_MAX(d);
long long e = SIGNED_MAX(e);

1

次のようなコードを書いてみませんか。

int  max_neg = ~(1 << 31);
int  all_ones = -1;
int max_pos = all_ones & max_neg;

28
intのサイズが32ビットであるという保証はなく、メモリ内の負の整数形式に関する保証もありません。それほど重要ではないが、人々に「〜」を検索させる必要はない。
Sqeaky

0

さて、私は(Philippe De Muyterの)以前の回答についてコメントする担当者もスコアも上げていません。そのため、署名なしの型用に拡張されたSIGNED_MAXの定義を使用した新しい例:

// We can use it to define limits based on actual compiler built-in types also: 
#define INT_MAX   SIGNED_MAX(int)
// based on the above, we can extend it for unsigned types also:
#define UNSIGNED_MAX(x) (  (SIGNED_MAX(x)<<1) | 1 ) // We reuse SIGNED_MAX
#define UINT_MAX  UNSIGNED_MAX(unsigned int) // on ARM: 4294967295
// then we can have:
unsigned int width = UINT_MAX;

これまたはそのヘッダーを使用する場合とは異なり、ここではコンパイラーからの実際の型を使用します。


0
#include <iostrema>

int main(){
    int32_t maxSigned = -1U >> 1;
    cout << maxSigned << '\n';
    return 0;
}

アーキテクチャに依存するかもしれませんが、少なくとも私のセットアップでは機能します。


-1

intの特定の最大値については、通常、16進数表記を記述します。

int my_max_int = 0x7fffffff;

不規則な10進値の代わりに:

int my_max_int = 2147483647;

-1

どうか(1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))。これは同じです2^(8*sizeof(int)-2) - 1 + 2^(8*sizeof(int)-2)です。

の場合sizeof(int) = 4 => 2^(8*4-2) - 1 + 2^(8*4-2) = 2^30 - 1 + 20^30 = (2^32)/2 - 1 [max signed int of 4 bytes]

2*(1 << (8*sizeof(int)-2)) - 1あふれるので使えませんが(1 << (8*sizeof(int)-2)) - 1 + (1 << (8*sizeof(int)-2))動作します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.