如何找到未知整数类型的最大值

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;
}

注意:给定的代码可能是错误的。对于无符号类型,早期的-1测试和返回是可以的,但是对于max_neg:首先,CHAR_BIT可能大于8,而且你将一个1移入了_sign bit_,我认为这是未定义的;对于all_ones-1可能不是“全部为1”,例如在一种补码或符号-幅度机器上。至于逻辑:似乎max_neg已经等于max_pos - gx_
3个回答

21

2
即使在 C++11 之前,该函数通常是内联的,并且编译器会在编译时对其进行评估。(但由于这不是必需的,因此您无法在需要编译时常量的上下文中使用它。) - James Kanze

5
"std::numeric_limits<T>::max()是一个很好的起点。"

0
这是一个好的选择:std::numeric_limits<T>::max() 或者如果你喜欢boost库:boost::integer_traits<T>::max()

“线性复杂度适用于两者。”- 嗯,对于什么进行线性复杂度计算?不存在的输入吗?这是一个简单的常数返回。 - Christian Rau
1
在 C++11 之前,标准并没有强制规定任何复杂度,因此实现可以使其具有线性复杂度(例如通过递增直到递增导致较小的值)。当然,可以肯定地说没有人会那么愚蠢。 - James Kanze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接