C++ c++;无符号无限循环比较错误

C++ c++;无符号无限循环比较错误,c++,unsigned-integer,C++,Unsigned Integer,注意到我正在编写的一个程序中有一个bug,提取了代码,基本上就是这样。 它与有符号整数进行无符号比较,并导致无限循环: #include <iostream> int main() { unsigned int i = 0; while (i < 1000000) { printf("%o\n", i); ++i; } return 0; } #包括 int main() { 无符号整数i=0; 而

注意到我正在编写的一个程序中有一个bug,提取了代码,基本上就是这样。
它与有符号整数进行无符号比较,并导致无限循环:

#include <iostream>  

int main()
{
    unsigned int i = 0;
    while (i < 1000000)
    {
        printf("%o\n", i);
        ++i;
    }
    return 0;
}
#包括
int main()
{
无符号整数i=0;
而(i<1000000)
{
printf(“%o\n”,i);
++一,;
}
返回0;
}
我试着用这个来代替:

#include <iostream>

int main()
{
    unsigned int i = 0;
    while (i < 1000000u)
    {
        printf("%o\n", i);
        ++i;
    }
    return 0;
}
#包括
int main()
{
无符号整数i=0;
而(i<1000000u)
{
printf(“%o\n”,i);
++一,;
}
返回0;
}
我认为这可以修复有符号/无符号比较,但事实并非如此,它仍然会遇到一个无限循环。所以我也试着把它转换成无符号整数,没有骰子,仍然是无限循环



使用Visual Studio 2015,完全优化,发布编译器。

这是因为int类型溢出。请看类型。对于如此庞大的数字比较,您应该使用
long
而不是
int

这是因为int类型溢出。请看类型。对于如此庞大的数字比较,您应该使用
long
而不是
int

虽然我无法在Win7或Ubuntu(均为64位)上重现无限循环,但我相信问题在于printf()函数带有无符号八进制数表示,这会让您认为它进入了无限循环。将
%o
参数更改为
%u
可能会澄清问题。

虽然我无法在Win7或Ubuntu(均为64位)上重现无限循环,但我认为问题在于printf()函数具有无符号八进制数表示,这会让您认为它进入了无限循环。将
%o
参数更改为
%u
可能会澄清问题。

您确定这是一个无限循环吗?这对我来说似乎是一个很长的循环,尤其是因为打印需要大量的时间。更改为
i+=1000
,查看退出条件是否有效。这不是有符号/无符号比较的问题。值
1000000
在这两个范围内,您试图解决这个问题,假设这是原因,但它不起作用。为什么要
#包括
,然后使用
printf
?作为参考:第一个程序在64位linux上使用gcc 5.3.1时按预期工作(打印编号)。你确定有问题,不仅仅是打印速度慢吗?他们在原始代码中使用了cout,这要慢得多…主要是为了测试,打印速度比测试快很多。你确定这是一个无限循环吗?这对我来说似乎是一个很长的循环,尤其是因为打印需要大量的时间。更改为
i+=1000
,查看退出条件是否有效。这不是有符号/无符号比较的问题。值
1000000
在这两个范围内,您试图解决这个问题,假设这是原因,但它不起作用。为什么要
#包括
,然后使用
printf
?作为参考:第一个程序在64位linux上使用gcc 5.3.1时按预期工作(打印编号)。你确定有问题,不仅仅是打印速度慢吗?他们在原始代码中使用了cout,这要慢得多……主要是为了测试,打印速度可能要快很多,但是现在在大多数平台上,
int
至少是32位。不太可能是这样。OP提到VS 2015,其中默认的int类型是32位,远远超过
1000000
所需的宽度。它的64位在VC++上编译,它确实打印数字,只是不停,直到它达到极限;然后由于未签名的规则,它仍然不会停止,它只是开始over@BrianDeragon
unsigned int
在VC++2015中仍然是32位的,即使对于64位编译也是如此。
long
的大小通常与
int
的大小相同。对于较大的数字,您可能不应该假设任何内容,而应该使用保证具有特定最小大小的类型;它们的存在是有原因的。但是,如果给定32位无符号整数类型,那么这个大小问题一开始就不是问题,您可以将其作为visual studio 2015的标准。也许吧,但是现在大多数平台上的
int
至少是32位。不太可能是这样。OP提到VS 2015,其中默认的int类型是32位,远远超过
1000000
所需的宽度。它的64位在VC++上编译,它确实打印数字,只是不停,直到它达到极限;然后由于未签名的规则,它仍然不会停止,它只是开始over@BrianDeragon
unsigned int
在VC++2015中仍然是32位的,即使对于64位编译也是如此。
long
的大小通常与
int
的大小相同。对于较大的数字,您可能不应该假设任何内容,而应该使用保证具有特定最小大小的类型;它们的存在是有原因的。但是,如果给定一个32位无符号整数类型,那么这个大小问题就不是一个问题,您可以将其作为visual studio 2015的标准。嗯,显然是这样,std::cout嗯,显然是这样,std::cout