web-dev-qa-db-ja.com

変数をCで可能な最大数にどのように設定しますか?

Cで変数を無限大(または保証された最大数の値)に等しくするように設定するにはどうすればよいですか?

20
Sam
#include <limits.h>
int x = INT_MAX;

編集:質問者が明らかにする前に答えました、私は彼らがどんなタイプを望んでいたかを推測していました。

31
dubiousjim

この種の定義を保持するlimits.hというファイルがあります(少なくともLinuxにはあります)。

/* Maximum value an `unsigned short int' can hold.  (Minimum is 0.)  */
#  define USHRT_MAX 65535

/* Minimum and maximum values a `signed int' can hold.  */
#  define INT_MIN   (-INT_MAX - 1)
#  define INT_MAX   2147483647

/* Maximum value an `unsigned int' can hold.  (Minimum is 0.)  */
#  define UINT_MAX  4294967295U
26
amo-ej1

符号なし整数型の最大値を取得する最も簡単な方法は、その型に(-1)をキャストすることです。標準(§6.2.5/ 9)では、符号なしの計算は、表現できる最大値より1大きい数を法として実行する必要があるため、符号なしの型Tの場合、式((T)-1)は、必然的にそのタイプで可能な最大値になります。

9
Jerry Coffin

整数の最大値を取得する別のポータブルな方法:

符号なし整数

unsigned int uMax = (unsigned int)~0;

符号付き整数

signed int iMax = (unsigned int)~0 >> 1;

説明

  • ~0->すべてのビットを1に設定
  • >> 1->すべてのビットを1桁右にシフトして、符号ビットを消去します
  • (unsigned int)は、~0Uを使用する代わりに、ビット反転後にunsigned intに型キャストします。これは、Cにshort、charリテラル(一般にintよりも小さいものすべて)の接尾辞がないためです。

したがって、可能な限り最大のchar値を得るには-数式の型キャストをunsignedcharなどに変更するだけです。

ボーナス-signedintの最小値

Max signedint式のすべてのビットをもう一度反転するだけです。

signed int iMin = ~((unsigned int)~0 >> 1);

これにより、最初の符号ビットが1に設定され、残りのビットがゼロに設定されます。

8

コメントに基づいて、unsigned intが必要です(「符号なし整数」と言うので、必ずしもunsigned intではなく整数値が必要な場合があります)。

Cでは、符号なし整数型の場合、値-1は、その型に変換されると、その型の最大値であることが保証されます。

size_t size_max = -1;
unsigned int uint_max = -1;
unsigned long ulong_max = -1;

SIZE_MAXUINT_MAX、およびULONG_MAXをそれぞれ変数に割り当てます。一般に、limits.hを含めて適切なマクロを使用する必要がありますが、上記のルールを知っておくと便利です。また、SIZE_MAXはC89にないため、size_t size_max = -1;はC99だけでなくC89でも機能します。

オーバーフロー動作は、符号なし整数型に対してのみ保証されることに注意してください。

6
Alok Singhal

この質問にはC++タグがあるので、numeric_limitsをお勧めします。

#include <limits>

unsigned x = std::numeric_limits<unsigned>::max();
4
Fred Larson

通常、これは1.0/0.0によって実行されますが、コンパイル警告が表示される場合があります。私はC89でそれを行う他の移植可能な方法を知りませんが、C99にはFP_INFINITEにマクロmath.hがあります。

編集:どうやらサムは実際には無限大を望んでいませんでしたが、他の人が述べているようにlimits.hで見つけることができる整数の制限。

2
Tronic

私はあなたがこのリンクをチェックしたいかもしれないと思います:

http://www.gnu.org/s/libc/manual/html_node/Infinity-and-NaN.html

私はこれを行い、gcc4.4.1で正常に動作します


#include "math.h"

int main(int argc, char**argv)
{ 
    int x = INFINITY; 
    return 0;
}
1
thelinuxer

私は通常、_MAXlimits.hにある* INT_MAXマクロを整数などに使用します。これらは、変数タイプに対して常に正しく設定されます。 uint32などの明示的にサイズ設定されたタイプでも、このヘッダーファイルに対応するエントリがあります。

これには、そのタイプの変数が保持できる最大の値であるという利点があります。

質問で要求した符号なし整数の場合は、UINT_MAXを使用します。

1
Andrew