2

I'm trying to obtain the maximum value of a certain unsigned integer type without including any headers like <limits>. So I thought I'd simply flip the bits of the unsigned integer value 0.

#include <iostream>
#include <limits>

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

I'm not very experienced on the subtle differences between these. Which is why I'm asking if some unexpected behavior or some platform/architecture issues could occur by using the first method.

4

2 回答 2

5

... 获取某个无符号整数类型的最大值而不包括任何标题

只需分配值-1

unsigned_type_of_choice max = -1;

-1将 (即 )转换int为任何无符号类型会导致number 的值比最大值减 1 大一。

以下不提供目标类型的最大值。当目标类型范围超过 的范围(unsigned即 的类型)时,它会失败~0U@Christopher Oicles

// problem
unsigned_type_of_choice max_wannabe = ~0U;
于 2016-10-05T03:35:29.433 回答
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 回答