Integer.MaxValue
JavaのC / C ++のような関数で(コンパイラに従って)整数の最大値を見つけるコードはありますか?
int
てlong long int
ください...
-pedantic
)はそれをサポートしています。
Integer.MaxValue
JavaのC / C ++のような関数で(コンパイラに従って)整数の最大値を見つけるコードはありますか?
int
てlong long int
ください...
-pedantic
)はそれをサポートしています。
回答:
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;
min
は正の最小値であり、整数min
は最小値であることに注意してください。Cマクロ/定数についても同様です。
uint64_t
およびの制限でありint64_t
、の制限ではありませんint
。
#include <limits>
およびint imax = std::numeric_limits<int>::max();
、エラーが発生しますCan't resolve struct member 'max'
。これが発生する理由と、それを修正する方法についてのアイデアはありますか?私はCLake IDEを使用しており、Ubuntu 14.04でCMakeおよびC ++ 11を使用しています。この問題に
私はそれが古い質問であることを知っていますが、多分誰かがこの解決策を使うことができます:
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が何ビットあるかをいつでも知る必要がなく、追加のライブラリを含める必要もありません。
cout << "INT_MAX:\t" << (int) ((~((unsigned int) 0)) >> 1) << '\n' << "UINT_MAX:\t" << ~((unsigned int) 0) << endl;
#include <climits>
#include <iostream>
using namespace std;
int main() {
cout << INT_MAX << endl;
}
numeric_limits<int>::max()
-テンプレートコンテキストでも機能しますが、(私には不可解な理由で)コンパイル時の定数として使用できません。INT_MAX
-マクロであり、テンプレート関数内ではほとんど役に立ちませんが、コンパイル時の定数として使用できます。
これは私が使用する符号付き整数の最大値を取得するために使用するマクロです。これは、使用される符号付き整数型のサイズとは無関係であり、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);
さて、私は(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;
これまたはそのヘッダーを使用する場合とは異なり、ここではコンパイラーからの実際の型を使用します。
どうか(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))
動作します。