使用按位而不是零值获取无符号整数的最大值

时间:2016-10-05 01:23:34

标签: c++ c bit-manipulation numeric-limits

我试图获取某个无符号整数类型的最大值,而不包括任何标题,如<limits>。所以我想我只是翻转无符号整数值0的位。

#include <iostream>
#include <limits>

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

我对这些之间的微妙差异并不十分熟悉。这就是为什么我要问使用第一种方法是否会发生某些意外行为或某些平台/架构问题。

2 个答案:

答案 0 :(得分:4)

  

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

只需指定值-1

即可
unsigned_type_of_choice max = -1;

-1int)转换为任何无符号类型会导致数字的值大于最大值减1。 / p>

以下内容未提供目标类型的最大值。当目标类型范围超出unsigned的范围时,它会失败,~0U// problem unsigned_type_of_choice max_wannabe = ~0U; 的类型。 @Christopher Oicles

<asp:SqlDataSource ID="databaseWork" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionString%>" SelectCommand="SELECT [ID], [FirstName] + ' '+[LastName] AS [FullName] FROM [People]">
</asp:SqlDataSource>

答案 1 :(得分:3)

您不应该将~0U分配给任何未签名的类型,chux's answer已经解释了原因。

对于C ++,使用以下内容可以获得所有无符号类型的最大可能值。

template <typename T>
T max_for_unsigned_type() {
    return ~(static_cast<T> (0));
}

否定你的确切类型的零。我使用详细的函数名称,因为它不应该用于签名值。问题是,对于检查签名,最简单的方法是包括一个额外的头,即type_traitsThis other answer然后会很有用。

用法:

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> ();

返回的值:(请参阅测试代码here

255
65535
4294967295
18446744073709551615
4294967295

注意:对签名类型执行此操作要困难得多,请参阅Programmatically determining max value of a signed integer type