找到最大的unsigned int ....为什么这不起作用?

时间:2014-02-10 18:15:16

标签: c++

你不能初始化unsigned int然后递增它直到它不再增加吗?这就是我试图做的,我得到了一个运行时错误“超时”。知道为什么这不起作用吗?知道如何正确地做到这一点?     #include

int main() { 

    unsigned int i(0), j(1);
    while (i != j) {
       ++i;
       ++j;
    }
    std::cout << i;

    return 0;

} 

6 个答案:

答案 0 :(得分:4)

无符号算术在C ++中被定义为模2 ^ n(其中n是 位数)。所以当你增加最大值时, 你得到0

因此,获得最大值的最简单方法是 使用-1

unsigned int i = -1;
std::cout << i;

(如果编译器给你一个警告,这让你烦恼,你 可以使用0U - 1,或使用0初始化,然后递减。)

答案 1 :(得分:1)

由于i 从不等于j,因此您有一个无限循环。

此外,这是用于确定unsigned int的最大值的非常效率低的方法。 numeric_limits为您提供结果,而不会循环2 ^(16,32,64,或者在unsigned int)迭代中有多少位。如果你不想这样做,你可以编写一个更小的循环:

unsigned int shifts = sizeof(unsigned int) * 8; // or CHAR_BITS
unsigned int maximum_value = 1;
for (int i = 1; i < shifts; ++i)
{
    maximum_value <<= 1;
    ++maximum_value;
}

或者只是做

unsigned int maximum = (unsigned int)-1;

答案 2 :(得分:0)

i将始终与j不同,因此您已进入无限循环。如果您想采用这种方法,您的代码应如下所示:

unsigned int i(0), j(1);
while (i < j) {
   ++i;
   ++j;
}
std::cout << i;

return 0;

注意我已将其更改为while (i<j)。一旦j溢出,我将大于j

当发生溢出时,该值不会保持在最高位置,它会回滚到最低可能的数字。

答案 3 :(得分:0)

我和j永远不会彼此相等。当无符号整数值达到最大值时,1将导致下一个值为最小值0。 例如,如果考虑unsigned char,则其最大值为255.添加1后,您将获得0。

所以你的循环是无限的。

答案 4 :(得分:0)

  

你不能初始化unsigned int然后递增它直到它不再增加吗?

没有。无符号算术是模块化的,因此它在最大值之后回绕到零。你可以像循环那样永远地继续递增它。

  

知道如何正确地做到这一点吗?

unsigned int max = -1;  // or
unsigned int max = std::numeric_limits<unsigned int>::max();

或者,如果您想使用循环来计算它,请将条件更改为(j != 0)(i < j)以在j换行时停止。由于i落后于j,因此它将包含最大值。请注意,这可能对签名类型不起作用 - 它们在溢出时会给出未定义的行为。

答案 5 :(得分:0)

我假设您正在尝试找到无符号整数可以存储的最大限制(十进制为65,535)。程序超时的原因是因为当int达到它可以存储的最大值时,它会“结束”。下一次j递增时,它将是65,535;我将是0。

这意味着你的方式,我永远不会等于j,循环将无限期地运行。如果你把它改成了Damien所拥有的,那你就得i == 65,535; j等于0.