web-dev-qa-db-ja.com

UINT32_MAXに相当するC ++とは何ですか?

C99では、stdint.hをインクルードすると、UINT32_MAXとuint32_tが得られます。ただし、C++では、UINT32_MAXが定義されます。 stdint.hをインクルードする前に__STDC_LIMIT_MACROSを定義できますが、既にstdint.hをインクルードした後に誰かがヘッダーをインクルードしている場合、これは機能しません。

C++では、uint32_tで表現可能な最大値を見つける標準的な方法は何ですか?

32
kdt

まあ、uint32_tについては知りませんが、基本型(bool, char, signed char, unsigned char, wchar_t, short, unsigned short, int, unsigned int, long, unsigned long, float, double and long double)については、numeric_limits経由で#include <limits>テンプレートを使用する必要があります。

cout << "Minimum value for int: " << numeric_limits<int>::min() << endl;
cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;

uint32_tが上記のいずれかの#defineである場合、このコードはそのまま使用できます

    cout << "Maximum value for uint32_t: " << numeric_limits<uint32_t>::max() << endl;
55
Glen

std::numeric_limits<T>::max()は、タイプTの最大値を定義します。

22
Pete Kirkham

さて、uint32_tは常に32ビットであり、常に符号なしなので、手動で安全に定義できます。

#define UINT32_MAX  (0xffffffff)

あなたもできる

#define UINT32_MAX  ((uint32_t)-1)
19
Lior Kogan

コメントすることはできませんので、ここにグレン対リオールコーガンの答えに対する私の意見があります。

静的変数を使用している場合、クラス内の定数値をnumeric_limits :: max()に割り当てると、初期化の順序のためにその値が実際にゼロに設定されるという問題が発生します(この記事を参照- ローカルスコープの静的変数のゼロ初期化および静的初期化

したがって、その場合、Lior Koganの回答を使用することによってのみ機能します。

// This looks cleaner, less error prone and easier to read than the other suggested by Lior Kogan
#define UINT32_MAX  ((uint32_t)-1)
1

代わりに、コンパイラプロセスの#includeシンボルを定義するようにビルドプロセスを変更することにより、__STDC_LIMIT_MACROS順序の問題を解消できる場合があります。

cxx -D__STDC_LIMIT_MACROS ...

もちろん、ヘッダー#undefsがこのシンボルである場合、依然として問題が発生します。

また、使用している標準ライブラリ実装の作成者は、ユーザーがその特定のシンボルを設定することを意図していない可能性があります。ユーザーがC++でC99型を有効にするために使用するコンパイラフラグまたは別のシンボルがある場合があります。

1
bk1e