查找最大的无符号 int ....为什么这不起作用?

Find largest unsigned int .... Why doesn't this work?

本文关键字:为什么 不起作用 int 无符号 查找      更新时间:2023-10-16

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

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 ,或者用 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。

所以你的循环是无限的。

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

这意味着你的工作方式,我永远不会等于j,并且循环将无限期地运行。如果你把它改成达米安的,你会得到 i == 65,535;j 等于 0。

您不能初始化一个无符号的 int 然后递增它直到它不再递增吗?

不。无符号算术是模块化的,因此它在最大值之后环绕到零。你可以像你的循环一样,永远递增它。

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

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

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