2013-07-08 38 views
5

Bilinmeyen türün maksimum tamsayı değerini nasıl bulabilirim?Bilinmeyen tür tamsayı türünün maksimum değeri nasıl bulunur?

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

Not: Verilen kod muhtemelen yanlıştı. İlk '-1' testi ve imzasız türler için geri dönüş tamam, ancak sonra: 'max_neg' için:' CHAR_BIT 'için önce' 8 'den daha fazla olabilir ve her neyse, bir '1''i _sign bit_'e kaydırıyorsunuz, undefined olduğunu düşünüyorum; ve "all_ones" için: -1 ---, "tamamlayıcılar" olabilir, örneğin bir kişinin tamamlayıcısı veya işaretleme ve büyüklükteki makine. Ve mantık için: "max_neg" zaten "max_pos" ile eşit olacak gibi görünüyor. –

cevap

21

std::numeric_limits<T>::max()'u kullanın. C++ 11'den beri bu işlev constexpr olup derleme zamanında değerlendirilir.

+2

C++ 11 öncesi bile, işlev genellikle satır içi ve derleyici bunu derleme zamanında değerlendirirdi. (Fakat bu gerekli olmadığından, bunu bir derleme zamanı sabiti gerektiren bağlamlarda kullanamazsınız.) –

5

std::numeric_limits<T>::max() iyi bir başlangıç ​​noktasıdır: orada bundan daha verimli bir şeydir.

0

Bu iyi: std::numeric_limits<T>::max() veya güçlendirmeyi seviyorsanız: boost::integer_traits<T>::max().

+0

* "Her ikisi için de doğrusal karmaşıklık" * - Huh, varolan olmayan girdide ne kadar doğrusal karmaşıklık? Döndükleri basit bir sabit. –

+1

@ChristianRau Pre C++ 11, standart herhangi bir karmaşıklık koymadı, bu yüzden bir uygulama _could_ lineer karmaşıklık yapar (art arda artışa kadar daha az bir değere neden olur). Tabi ki, hiç kimsenin bu kadar aptalca olmadığını söylemek güvenli. –

+0

@ChristianRau Haklısınız. – soerium

İlgili konular