I was told by an experienced programmer(spoj,codechef,topcoder etc ) than as a general rule one can use int for values upto 10^9.
What is the general rule for using signed long int, unsigned long int, signed long long int, unsigned long long int
この質問に対する答えは、プラットフォームによって異なります (プラットフォームによって整数のサイズが異なる可能性があるため)。http://en.cppreference.com/w/cpp/types/numeric_limitsで制限のかなり完全なリストを見つけることができます
int
andを主に使用するlong
のは、これらの型を使用する API とやり取りするときです。たとえば、エラー コードとファイル記述子には型int
とftell
戻り値がありますlong
。int
扱う数値が非常に小さく、制限がある (つまり、完全に制御できないものに比例して大きくならない) ことがわかっている場合は、インデックス/カウンターにも使用できます。それ以外の場合は、メモリ内のオブジェクトのサイズ/インデックス/カウントに常に使用し、特定の既知の大きさの値を格納できるようにする必要がある場合はsize_t
、正確なサイズまたは少なくともサイズの型を使用する必要があります。stdint.h
使用できない場合stdint.h
(たとえば、C89 または古い C++ 実装で)、代わりに単純な古い型を使用できます。
short
少なくとも -32767 ~ 32767 の範囲を格納できます。unsigned short
少なくとも 0 ~ 65536 の範囲を格納できます。int
少なくとも -32767 ~ 32767 (および POSIX 準拠システムでは -2147483647 ~ 2147483647) の範囲を格納できます。unsigned
少なくとも 0 から 65536 (および POSIX 準拠システムでは 0 から 4294967295) の範囲を格納できます。long
少なくとも -2147483647 ~ 2147483647 の範囲を格納できます。unsigned long
少なくとも 0 ~ 4294967295 の範囲を格納できます。自分でルールを開いてlimits.h
推測できます。
#define LONG_MIN (-2147483647L - 1) /* minimum (signed) long value */
#define LONG_MAX 2147483647L /* maximum (signed) long value */
#define ULONG_MAX 0xffffffffUL /* maximum unsigned long value */
#define LLONG_MAX 9223372036854775807i64 /* maximum signed long long int value */
#define LLONG_MIN (-9223372036854775807i64 - 1) /* minimum signed long long int value */
#define ULLONG_MAX 0xffffffffffffffffui64 /* maximum unsigned long long int value */
移植性の制約によって異なります。正式には、anint
は範囲内の値のみをサポートすることが保証されている[-32767,32767]
ため、さらに必要な場合は、を使用する必要がありますlong
。実際には、多くのプログラムは16ビットマシンへの移植性を必要とせず(今日では非常にまれです)、ほとんどの最新の64ビットプラットフォームでlong
は、必要以上の64ビットになり、速度が低下します(地域性が低いためのみ)。int
少なくとも32ビットであると想定できる場合は、次の例外を除いて、ほとんどすべての場所で使用する必要があります。
&
ビット単位の|
、、、、またはシフト演算子を使用した実際のビット単位の表現に関心がある場合は、デフォルトで型を使用する必要があります^
が、次のいずれかの場合は他のサイズを使用します。~
unsigned
unsigned int
のモジュロ演算が必要な場合はunsigned
、符号なし型を使用してください。これは非常にまれですが、ハッシュコードの計算などで発生します。
非常に大きなテーブル(ベクトルまたはその他の連続した表現)がある場合は、short
またはsigned char
(またはunsigned short
、unsigned char
ビット単位の表現に関心がある場合は、)を検討することもできます。符号は実装で定義されているため、文字以外にはプレーンを使用しません。char
2 ^ 31より大きい値を表す必要がある場合は、を検討してlong long
ください。(ただし、long long
そのような場合でも十分な大きさではないことが多く、何らかのBigInteger
クラスが必要になります。)
原則として、それ以外int
は例外です。
使用している libc に応じて、一般にint
、などの制限値を示すマクロがあります。移植可能な例については、 gliblong int
が提供する制限マクロを参照してください。
標準ヘッダーclimitsまたは limits.hを確認することをお勧めします。
原則として、符号付きのタイプの場合、タイプのサイズが n ビットの場合、
Max Positive Value = 2^(n-1)-1 <br>
Max Negative Value = -2^(n-1)
繰り返しますが、各プラットフォームにはバリエーションがある可能性があり、正確な値を取得するには、そのプラットフォームで利用可能な limits.h を参照する必要があります。