查找最大的无符号 int ....为什么这不起作用?
Find largest unsigned int .... Why doesn't this work?
>你不能初始化一个无符号的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
,这将包含最大值。请注意,这可能不适用于有符号类型 - 它们在溢出时会给出未定义的行为。
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 为什么二进制搜索在我的测试中不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 为什么这段代码不起作用,我该如何解决?
- 为什么 zlib 放气初始化调用一次不起作用?
- 为什么 ulimit -v 在 Clang 的地址清理器下不起作用?
- 为什么在 while 循环中返回表达式不起作用
- 为什么这些完全相似的代码不起作用?
- 为什么我的数组双精度函数不起作用?
- 为什么我的 if else 语句不起作用并从数组中输出正确的索引?
- 为什么使用数组元素查找最大数字的程序不起作用?
- 自动点击器在游戏中 - 为什么不起作用?
- 像在 Python 中一样C++循环中的参数解析。为什么不起作用?
- 多维动态数组,为什么不起作用?
- 函数A调用函数B,反之亦然(为什么不起作用)
- C++二进制树构建为什么不起作用