你不能初始化unsigned int然后递增它直到它不再增加吗?这就是我试图做的,我得到了一个运行时错误“超时”。知道为什么这不起作用吗?知道如何正确地做到这一点? #include
int main() {
unsigned int i(0), j(1);
while (i != j) {
++i;
++j;
}
std::cout << i;
return 0;
}
答案 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.