C ++无符号无限循环比较错误
c++ unsigned infinite loop comparison bug
注意到我正在处理的一个程序中存在错误,提取了代码,基本上就是这样。
它与有符号的 int 进行无符号比较并导致无限循环:
#include <iostream>
int main()
{
unsigned int i = 0;
while (i < 1000000)
{
printf("%o\n", i);
++i;
}
return 0;
}
我尝试改用这个:
#include <iostream>
int main()
{
unsigned int i = 0;
while (i < 1000000u)
{
printf("%o\n", i);
++i;
}
return 0;
}
我认为这会修复 signed/unsigned 比较,但事实并非如此,它仍然陷入无限循环。所以我也试着把它转换成unsigned int,没有骰子,仍然是无限循环。
使用Visual Studio2015,全面优化,发布编译器。
这是因为int类型溢出。请参阅类型 limits。对于如此庞大的数字比较,您应该使用 long
而不是 int
虽然我无法在 Win7 或 Ubuntu(均为 64 位)上重现无限循环,但我认为问题在于您的 printf() 函数具有无符号八进制数表示形式,这让您认为它进入了一个无限循环。将 %o
参数更改为 %u
可能会澄清问题。
注意到我正在处理的一个程序中存在错误,提取了代码,基本上就是这样。
它与有符号的 int 进行无符号比较并导致无限循环:
#include <iostream>
int main()
{
unsigned int i = 0;
while (i < 1000000)
{
printf("%o\n", i);
++i;
}
return 0;
}
我尝试改用这个:
#include <iostream>
int main()
{
unsigned int i = 0;
while (i < 1000000u)
{
printf("%o\n", i);
++i;
}
return 0;
}
我认为这会修复 signed/unsigned 比较,但事实并非如此,它仍然陷入无限循环。所以我也试着把它转换成unsigned int,没有骰子,仍然是无限循环。
使用Visual Studio2015,全面优化,发布编译器。
这是因为int类型溢出。请参阅类型 limits。对于如此庞大的数字比较,您应该使用 long
而不是 int
虽然我无法在 Win7 或 Ubuntu(均为 64 位)上重现无限循环,但我认为问题在于您的 printf() 函数具有无符号八进制数表示形式,这让您认为它进入了一个无限循环。将 %o
参数更改为 %u
可能会澄清问题。