2009-06-01 7 views
12

私は4294967295より大きい値を得ることができる整数変数を持っています。C++で2^32より大きい整数にはどのような型を使用しますか?

私はそれをどのようなタイプ(long long、double、または何か他のもの)に使うべきですか?

+1

それは異常に大きいかもしれませんか?人々は64ビットの問題に住んでいるので、あなたが天文学的な距離や原子数を見ていると言えば、答えはすぐに "倍"にシフトし、整数を忘れる。 – jpinto3912

+0

素晴らしいコメント!私の場合は64ビットよりも大きくはありませんが、それでも面白いですが、どうすればいいですか?なぜこのような場合に「ダブル」を使用すべきですか? –

答えて

8

言語が整数型のサイズを指定しないため(Cのsizeofが1以外の場合)、C++で移植可能な方法はありません。コンパイラのドキュメントを参照する必要があります。

+5

です。標準では、各タイプの最小の大きさが指定されているため、含意によって最小ビット数(バイトではない)が示されます。http://stackoverflow.com/questions/271076/what-is-the-difference-between-an-int-and -a-long-in-c/271132#271132 –

+1

C++ 11では、少なくとも64ビット幅であることが保証された 'long long'型と' unsigned long long'型があり、 'll'、' ull 'リテラル。 'cstdint'ヘッダには、' int64_t'、 'int_least64_t'、' int_fast64_t'、 'uint64_t'、' uint_least64_t'、 'uint_fast64_t'型エイリアスもあります。 –

0

ダブルは浮動小数点です。 おそらく長めにしてください。どのエイリアスが優先されるのかわかりません。

13

long longを使用し、可能であれば、このタイプが十分広い(smthのようなsizeof(long long) >= 8)コンパイル時アサーションを追加してください。

doubleは整数ではなく、浮動小数点用です。

+9

long longは標準C++データ型ではありません –

+5

ISO/IEC 9899:TC3 - 委員会草案2007年7月7日によると、前の版からの主な変更点は次のとおりです。long long int型とライブラリ関数 long long型のオブジェクト LLONG_MAX 9223372036854775807(2^63 - 1) –

+4

これはC99のドキュメントであり、C++ではありません。 –

1

負の数を必要としない場合は、ほとんどの場合と同様に符号なしの長い音が必要です。

12

試行:

big num。

http://mattmccutchen.net/bigint/ big int。

私はどちらも使用しませんでしたが、私はJavaで似たようなことを使用しました。

+0

gmplibは素晴らしいです+1 – dfa

+0

すばらしい答え! – tekknolagi

2

私は

uint64_t 

を使用しますが、それは標準ではありません。

+1

実際にstdint.hはC99の一部です。しかし、多くのコンパイラベンダーは、10年後(たとえ10年前のようにITがどのように見えたかを覚えていますか? – lispmachine

+0

あなたの仕事は分かりませんが、私にとっては3つのコンパイラベンダが重要です。マイクロソフト、インテル、およびGCC。そして、3人とも伝統的に「新しい」標準コンプライアンスに優れています。 SunW C++やHP、IBMはそれほど多くはありませんが、Windows/Linuxの世界ではそれは問題ではありません。 15年前、私は朝食用のコンパイラとリンカーを壊すことを覚えています。実際には、リンカのバグを修正するのに2月のうちにDECの方がより良い部分を取ったので、Windows NT AlphaのPro/ENGINEERを出荷することができました。 –

0

あなたのコンパイラは、長い長いあなたはもちろんGMP

3

のような複数の精密算術を探すことができますが、長い2を含む構造でそれらを自分で実装することはできますが、その他のキャリーとcaursefulになる必要がありますされていない場合long longは標準のC++データ型ではないため、doubleは浮動小数点型なので、どちらのプロポーザルも良くありません。私のプログラムは、ポータブルにする必要がありますので

、私は自分のタイプの私が使用し、そのスーツは、すべてのコンパイラ(Visual Studioとgccの)を#defineしするつもりです:

#ifdef WIN32 
    #define unsigned_long_long unsigned __int64 
    #define long_long __int64 
#else // gcc. Might not work on other compilers! 
    #define unsigned_long_long unsigned long long 
    #define long_long long long 
#endif 
+1

これはWindowsの問題ではないことに注意してください。これはC++標準の問題です.Windows以外のプラットフォームでも長い間サポートされる保証はありません。 –

+0

MSDN long longによると、VC++の__int64と同等であるため、定義する必要はありません。 – sharptooth

+0

また、g ++は-pedanticでコンパイルすると多くの警告を出すことに注意してください。ほとんどのC++プログラムは(確かにそうでなければなりません) –

1

TTMathを試してみてください。 (32 * 100)^ 0〜2符号なし整数を保持できるタイプを作成します

typedef ttmath::UInt<100> BigInt; 

-1:あなたがする必要があるのは、単一のヘッダを含め、その後のようなBIGNUM型を宣言です。 intを使用する場合は、BigIntを使用してください。

もちろん、テンプレートパラメータの任意のサイズを選択できます。 100は恐ろしいかもしれません;-)

libはx86とx64でのみ動作しますが、それらのプロセッサではOSクロスプラットフォームです。

+0

私はttmathを使用しようとしていて、あなたが言ったことを使いました。あなたは彼がIntを使う場所でBigIntを使う必要があると言いましたが、実際にはこのエラー "class BigIntにはメンバーがいません..."があります、なぜこれが起こっていると思いますか? – wxiiir

+0

@wxiirあなたの変数に「blah」という名前が付けられているときに、「BigIntには名前のついたメンバーがいません」というエラーが表示されました。 'ttmath :: UInt <100> blah = 0;のような単純な宣言を試してみてください。 blah = blah + 10; '? – HostileFork

3

がダブルで使用しないでください、ので:

cout.setf(ios::fixed); 
cout << LONG_LONG_MAX << endl; 
cout << double(LONG_LONG_MAX) << endl; 

cout << LONG_LONG_MAX-100 << endl; 
cout << double(LONG_LONG_MAX-100) << endl; 

出力:

9223372036854775807 
9223372036854775808.000000 
9223372036854775707 
9223372036854775808.000000 
+0

はい、実際に精度を失う(同じサイズの整数型と比較して)指数を識別するビットの一部を二重にしますが、 –

1

現在Cをたくさん/ C++コンパイラはstdint.hまたはinttypes.hヘッダーのいずれかを持っています。

int_fast64_tまたはint64_tは、オプション(IMHOは最も携帯性があります)です。

7

あなたの数字は64ビットに収まると仮定します。そうでない場合はGMPのようにarbitrary-precision arithmetic libraryが必要です。

理論的には、C++で64ビット演算を行うのは簡単で移植性の高い方法はありません。実際には、ほとんどのC++コンパイラも "旧式の" Cヘッダをサポートしており、C99はstdint.hという素晴らしいヘッダを持っています。

だから最初に実行します。そして、タイプint64_tを使用

#include <stdint.h> 

(署名)とuint64_t(符号なし)。

1

あなたのプログラムはどのように移植可能でしょうか? TR1にはcstdintとstdint.hがあるので、ほとんどの最新のコンパイラでサポートされている可能性があります。次に、cstdintがサポートされていない場合に使用できるBoost cstdint.hppがあります。

0

ちょうど好奇心から - 私が望むならあなた自身のコードを作るのは難しくないと思います。つまり、これらのデータ型はすべてあらかじめ定義された構造を持っていますが、たとえば指数を使用するdouble構造体を使用して、次のようなことを行うことができます:

あなたは「にISNれ、

1.123×10 ^(100000000000000000000000000000000000)のようなものを保存したい場合は、そう、10に

を数とパワー - ダブルで、それには2つの部分を持つオブジェクトを作成しますダブルでサポートされている場合は、1.123 ...の部分をダブルで格納し、次に10の倍数を別のdouble/int/float(任意のスーツ)として格納してからそこから取り出します。もちろん、これは最善の方法ではないかもしれません。おそらく、除算、減算などのために多くの機能をコーディングする必要がありますが、定義された通常のデータ型を使用するので、移植性があります。これの使用可能性は、達成しようとしているものと、これを1つのプロジェクトを超えて使用する予定があるかどうかにかかっていますが、そのような数値が絶対的な条件であれば、それを実行するのは義務的な方法です。