[英]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
换行时停止。 由于i
在j
后面,所以将包含最大值。 请注意,这可能不适用于带符号的类型-它们在溢出时会产生未定义的行为。
我假设您正在尝试查找无符号整数可以存储的最大限制(十进制为65,535)。 程序超时的原因是,当int达到可存储的最大值时,它“结束了”。 下次j递增时,它将为65,535; 我将是0。
这意味着您要使用的方式永远不会等于j,并且循环将无限期地运行。 如果将其更改为Damien拥有的,则i == 65,535; j等于0。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.