2013-07-08 16 views
5

Jak znaleźć maksymalną liczbę całkowitą nieznanego typu? Czy istnieje coś bardziej efektywne niż to:Jak znaleźć maksymalną wartość nieznanego typu całkowitego?

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

Uwaga: podany kod prawdopodobnie był nieprawidłowy. Wczesny test "-1" i powrót dla typów bez znaku jest OK, ale wtedy: dla 'max_neg': pierwszy' CHAR_BIT' może być większy niż '8', a mimo to przesuwasz' 1' do _ignal bit_, co moim zdaniem jest nieokreślone; a dla 'all_ones':' -1' może _nie_ być "wszystkimi", na przykład na maszynie do dopełniania lub znaku i magnitudo. I dla logiki: wygląda na to, że 'max_neg' będzie już równe' max_pos'. –

Odpowiedz

21

Użyj std::numeric_limits<T>::max(). Ponieważ C++ 11, ta funkcja jest constexpr i tym samym jest oceniana podczas kompilacji.

+2

Nawet pre-C++ 11, funkcja była ogólnie inline, a kompilator oceniłby ją podczas kompilacji. (Ale ponieważ nie było to wymagane, nie można go było używać w kontekstach, które wymagały stałej czasowej kompilacji.) –

5

std::numeric_limits<T>::max() jest dobrym punktem wyjścia.

0

To dobrze: std::numeric_limits<T>::max() lub jeśli podoba Ci się zwiększenie: boost::integer_traits<T>::max().

+0

* "Liniowa złożoność dla obu." * - Huh, liniowa złożoność co, nieistniejące wejście? Jest to prosta stała, którą powracają. –

+1

@ChristianRau Pre C++ 11, standard nie narzucał żadnej złożoności, więc implementacja może spowodować złożoność liniową (powiedzmy, zwiększając wartość, dopóki inkrementacja nie spowoduje mniejszej wartości). Oczywiście bezpiecznie można powiedzieć, że nikt nie był aż tak głupi. –

+0

@ChristianRau Masz rację. – soerium

Powiązane problemy