繁体   English   中英

查找最大的unsigned int…为什么不起作用?

[英]Find largest unsigned int … Why doesn't this work?

您是否不能初始化一个无符号的int然后增加它,直到它不再增加? 这就是我试图做的,并且遇到运行时错误“超时”。 知道为什么这行不通吗? 任何想法如何正确地做到这一点? #包括

int main() { 

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

    return 0;

} 

无符号算术在C ++中定义为模2 ^ n(其中n是位数)。 因此,当增加最大值时,您将获得0

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

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

(如果编译器向您发出警告,并且使您0U - 1困扰,则可以使用0U - 1 ,或者使用0初始化,然后递减。)

因为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;

i将永远不同于j ,因此您进入了一个无穷循环。 如果要采用这种方法,则代码应如下所示:

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

return 0;

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

当发生溢出时,该值不仅会保持最高,还会回绕到尽可能低的数字。

i和j永远不会相等。 当一个无符号整数价值得到最大程度的增加了它1将导致下一个值将是0。例如,如果最低要考虑无符号的字符则其最大值为255加1,你会得到0后。

因此,您的循环是无限的。

您是否不能初始化一个无符号的int然后增加它,直到它不再增加?

不能。无符号算术是模块化的,因此在最大值之后会回零。 您可以像循环一样永久地进行递增。

任何想法如何正确地做到这一点?

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

或者,如果要使用循环来计算它,请将条件更改为(j != 0)(i < j)以在j换行时停止。 由于ij后面,所以将包含最大值。 请注意,这可能不适用于带符号的类型-它们在溢出时会产生未定义的行为。

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

这意味着您要使用的方式永远不会等于j,并且循环将无限期地运行。 如果将其更改为Damien拥有的,则i == 65,535; j等于0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM