it-swarm-ja.tech

C ++:最大整数

移植可能な最大整数を提供するC++クロスプラットフォームライブラリはありますか?

宣言したい:

const int MAX_NUM = /* call some library here */;

管理対象外のMSVC 2008を使用しています。

36
sivabudh

C++標準ライブラリヘッダー<limits>、 見つけるだろう:

std::numeric_limits<int>::max()

これにより、int型の変数に格納できる最大値がわかります。 numeric_limitsはクラステンプレートであり、任意の数値型を渡して、保持できる最大値を取得できます。

numeric_limitsクラステンプレートには、多くの 数値型に関するその他の情報 があります。

93
James McNellis

見る limits.h(C)またはclimits(C++)。この場合、INT_MAX 絶え間ない。

10

私はそれが古い質問であることを知っていますが、誰かがこの解決策を使用できるかもしれません:

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.

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

サイズは符号付きで負なので、符号ビットを1にシフトしますが、これはあまり役に立たないので、符号なしintにキャストし、代わりに0にシフトし、他のすべてのビットを1のままにして符号ビットを0に設定します。

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

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

6
MJeB

答えは出ましたが、昔から知りたいだけでした。

int max = (unsigned int)-1

それは同じものを与えますか

std::numeric_limits<int>::max()

Apコンパイラーを使用したHP UXの場合:

#include <iostream>
#include <limits>
using namespace std;

int main () {
  if (sizeof(int)==sizeof(long)){
    cout<<"sizeof int == sizeof long"<<endl;
  } else {
    cout<<"sizeof int != sizeof long"<<endl;
  }

  if (numeric_limits<int>::max()==numeric_limits<long>::max()){
    cout<<"INT_MAX == lONG_MAX"<<endl;
  } else {
    cout<<"INT_MAX != LONG_MAX"<<endl;
  }

  cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;
  cout << "Maximum value for long: " << numeric_limits<long>::max() << endl;
  return 0;
}

以下を印刷します。

sizeof int == sizeof long

INT_MAX!= LONG_MAX

Int型とlong型の両方が4バイトであることを確認しました。 manpage limits(5)は、INT_MAXとLONG_MAXの両方が2147483647であると述べています

http://nixdoc.net/man-pages/HP-UX/man5/limits.5.html

したがって、結論std :: numeric_limits <type> ::は移植性がありません。

1
yet