2

のようなヘッダーを含めずに、特定の符号なし整数型の最大値を取得しようとしています<limits>。そこで、符号なし整数値 0 のビットを単純に反転させようと考えました。

#include <iostream>
#include <limits>

int main()
{
    std::cout << (~0U) << '\n'; // #1
    std::cout << (std::numeric_limits< unsigned >::max()) << '\n'; // #2
    return 0;
}

これらの微妙な違いについては、私はあまり経験がありません。そのため、最初の方法を使用すると、予期しない動作やプラットフォーム/アーキテクチャの問題が発生する可能性があるかどうかを尋ねています。

4

2 に答える 2

3

~0U署名されていない型だけに割り当てるべきではありません.chuxの答えはすでにその理由を説明しています.

C++ の場合、次のようにして、すべての符号なし型の最大値を取得できます。

template <typename T>
T max_for_unsigned_type() {
    return ~(static_cast<T> (0));
}

正確なタイプのゼロを否定しています。符号付きの値には使用しないため、冗長な関数名を使用します。問題は、署名をチェックするための最も簡単な方法は、追加のヘッダー、つまりtype_traitsを含めることです。この他の答えは役に立ちます。

使用法:

max_for_unsigned_type<uint8_t> ();
max_for_unsigned_type<uint16_t> ();
max_for_unsigned_type<uint32_t> ();
max_for_unsigned_type<uint64_t> ();
max_for_unsigned_type<unsigned> ();

返される値: (テストコードはこちらを参照)

255
65535
4294967295
18446744073709551615
4294967295

注: 符号付きの型に対して行うのははるかに困難です。符号付き整数型の最大値をプログラムで決定するを参照してください。

于 2016-10-05T15:40:34.767 に答える