2013-10-14 8 views
13

size_t値の全範囲を含むことができる署名付きタイプの標準(またはMSVC独自の)タイプ定義がありますか?私。 64ビットシステムでは、128ビット符号付き整数になります。size_tを含むことができる符号付き型のtypedef?

+0

'unsigned long long' –

+0

タイトルに誤りがあります。私は署名されたタイプについて尋ねていた。 – japreiss

+0

署名された型を特別な意味でオーバーロード/エスケープする理由がない場合は、 'boost :: optional <>'ラッパーを考慮することができます。 –

答えて

10

一般に、このようなタイプは定義できません。 size_tをサポートされている最大の符号なしタイプにすることは、実装にとって完全に正当です。つまり、署名されたタイプはすべての値を保持できません。

ptrdiff_tは必ずしも十分に広いわけではありません。これは2つのポインタを減算した結果ですが、ポインタの減算がオーバーフローできないということは何もありません。同じ配列オブジェクトの要素への2つのポインタが減算される場合、結果は、2つの配列 要素の添字の差である 、

:C++標準のセクション5.7を参照。結果の型は、実装定義の符号付き 整数型です。このタイプは、 std::ptrdiff_t<cstddef>ヘッダー(18.2)に定義される同じタイプでなければなりません。他の 算術オーバーフローの場合と同様に、結果が指定されたスペースに収まらない場合は、 の動作は未定義です。

最大符号付きタイプは<stdint.h>又は<cstdint>で定義され、intmax_tあります。これはC99の機能であり、C++ 11はC99標準ライブラリを組み込む最初のC++標準であったため、コンパイラがサポートしていない可能性があります(MSVCはそうでない可能性が高いです)。 size_tの可能なすべての値を保持するのに十分な符号付きタイプがある場合は、intmax_t(ただし、の場合もあります)。

long longを使用することもできます。これは、少なくとも64ビット(おそらくintmax_tと同じ)が保証された符号付きタイプです。 size_tの可能な値をすべて保持するのに十分ではない場合でも、実現例で実際に8エキシーバイト(つまり8192ペタバイトまたは8388608テラバイト)を超えるオブジェクトがサポートされていない限り、すべての値がほぼ確実に保持されます。

(注、私は疑わしい妥当性のある「tera-」、「exa-」「peta-」、とのバイナリ定義を、使用しています。)

+1

* "とMSVCはおそらく" * - 新しい注釈型は実際に* 2010年以来* MSVC *標準ライブラリが持っていた数少ないC++ 11の機能の1つでした。 –

+0

また、特定のプラットフォームでどのサイズを取得するのか分からない場合は、次のように追加します: 'static_assert(sizeof(intmax_t)> sizeof(size_t)、" size_t ");'そうすれば、コンパイラは潜在的に問題に陥っているかどうかを警告します。 –

2

私はあなたには、いくつかのためにこのタイプを必要とすると仮定しますポインタ演算の一種。 std::ptrdiff_t以外のものが必要なことはほとんどありません。現代のマシンでこれが役割を果たす唯一のケースは、32ビットモードで2^31バイトを超えるデータセットで作業している場合です。 (これはWindowsでは特別な作業がなければ実行できません)。同時に2つのサイズの配列を使用することはできません。この場合、おそらく64ビットモードで動作するはずです。

64ビットモードでは、現在のメモリ開発のスピードでは、今後40年間は問題にはならないでしょう。それが問題になったら、128ビットモードでコードをコンパイルしてください。それは引き続き実行されます。 ;)

2

システムの最大値を含む標準タイプが必要な場合は、おそらく<cstdint>(C++ 11以降)が役立つ可能性があります。

このヘッダーには、最大幅の整数型を保持するtypedefがあります。タイプはintmax_tです。符号付き整数の場合はintmax_t、符号なし整数の場合はuintmax_tは、アーキテクチャが完全にサポートする最大整数です。

std::cout << "intmax_t is same int64_t? " 
      << (std::is_same<intmax_t, int64_t>::value ? "Yes" : "No"); 

ウィル出力:

intmax_t型が同じであるint64_tの

それでは、あなたは、64ビットアーキテクチャでは、次の命令だと仮定してみましょうか?はい

Live demo

希望します。

関連する問題