質問
JavaでInteger.MaxValue
機能のようなC / Cの整数の最大値を見つけるために、任意のコードが(従ってコンパイラ)++がありますか?
解決
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;
他のヒント
私はそれが古い質問です知っているが、多分誰かがこのソリューションを使用することができます:
int size = 0; // Fill all bits with zero (0)
size = ~size; // Negate all bits, thus all bits are set to one (1)
これまでのところ、私たちは持っている-1結果として「のサイズのまで署名したint型です。
size = (unsigned int)size >> 1; // Shift the bits of size one position to the right.
標準変数は符号なしまたは署名され、陽性であるならば、変数が署名と負と0である場合にシフトされるビットが1である、と言うように
のサイズの署名と負我々は多くを助けされていない、1である符号ビットにシフトするので、私たちは、代わりに0にシフトするために強制的に、unsigned int型にキャスト、符号ビットをセットするとさせながら0に他のすべてのビットが1のままである。
cout << size << endl; // Prints out size which is now set to maximum positive value.
また、マスクとXORを使用することができますが、その後、私たちは、変数の正確なビットサイズを知っていました。フロントのビットをシフトして、我々はintは、マシンやコンパイラに持っても、私たちは余分なライブラリを含める必要がありますどのように多くのビットいつでも知っている必要はありません。
#include <climits>
#include <iostream>
using namespace std;
int main() {
cout << INT_MAX << endl;
}
ここで私が使用される符号付き整数型のサイズとは無関係であり、符号付き整数の最大値を取得するために使用マクロがあるため、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);
なぜのようなコードの一部を書きません:
int max_neg = ~(1 << 31);
int all_ones = -1;
int max_pos = all_ones & max_neg;
O.K。私どちらも彼の SIGNED_MAXのための定義自明unsigned型に拡張を使用して、新しい例したがって、(フィリップ・ド・Muyterの)前の回答にコメントでも、それがスコアです調達する担当者を持っています:
// 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;
このまたはそのヘッダーを使用する場合とは異なり、ここでは、コンパイラから実数型を使用します。
の INT の特定の最大値については、私は通常16進数を記述します。
int my_max_int = 0x7fffffff;
の代わりに、不規則な小数値の
int my_max_int = 2147483647;
何(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))
働くことはできません。
#include <iostrema>
int main(){
int32_t maxSigned = -1U >> 1;
cout << maxSigned << '\n';
return 0;
}
これは、アーキテクチャに依存するかもしれないが、それは、少なくとも私のセットアップで作業を行います。