2013-07-08 23 views
5

未知の型の最大整数値を見つけるにはどうすればよいですか? は、これよりもより効率的な何かがあります:未知の整数型の最大値を求める方法

template<class T> 
T test(T i) { 
    if (((T)-1) > 0) 
     return -1; 
    T max_neg = ~(1 << ((sizeof(T)*8)-1)); 
    T all_ones = -1; 
    T max_pos = all_ones & max_neg; 
    return max_pos; 
} 
+0

注:指定されたコードが間違っている可能性があります。最初の '-1'テストとunsigned型の返答はOKですが、' max_neg'の場合、最初の 'CHAR_BIT'は' 8'以上で、とにかく '1'を_signビットにシフトしています。私は未定義だと思う。 'all_ones'の場合:' -1'は、例えば1の補数や符号と大きさのマシンでは「すべてのもの」ではありません。ロジックについては、 'max_neg'はすでに' max_pos'に等しいと思われます。 –

答えて

21

std::numeric_limits<T>::max()を使用してください。 C++ 11以降、この関数はconstexprであり、コンパイル時に評価されます。

+2

pre-C++ 11でも、関数は一般的にインラインであり、コンパイラはコンパイル時に評価します。 (ただし、これは必須ではないため、コンパイル時定数を必要とするコンテキストでは使用できませんでした) –

5

std::numeric_limits<T>::max()は良い出発点です。

0

これは良いです:std::numeric_limits<T>::max()またはあなたが好きな場合は:boost::integer_traits<T>::max()

+0

* "両方の線形複雑さ" * - 実際には存在しない入力の線形複雑さ?彼らが返す単純な定数です。 –

+1

@ChristianRau Pre C++ 11では、標準では複雑さがありませんでした。そのため、インプリメンテーションでは線形の複雑さが増します(たとえば、インクリメントの値が小さくなるまでインクリメント)。もちろん、そんなに愚かではないと言うのはおそらく安全でしょう。 –

+0

@ChristianRauそうです。 – soerium

関連する問題