这是VC编译器的错误吗?关于无符号整数换行
我认为下面的C程序应该输出1:这是VC编译器的错误吗?关于无符号整数换行,c,visual-c++,unsigned,C,Visual C++,Unsigned,我认为下面的C程序应该输出1: #include <stdio.h> int main() { unsigned int n=18u; while ((n+17u)>=17u) n-=17u; printf("%u\n",n+17u); return 0; } 编译器似乎做了一些优化,生成了一个无限循环 我认为((n+17u)>=17u)并不总是正确的,因为如果n==0xFFFF..FF,n+17u将换行为16u 是我错了,还是编译器错了?gc
#include <stdio.h>
int main()
{
unsigned int n=18u;
while ((n+17u)>=17u) n-=17u;
printf("%u\n",n+17u);
return 0;
}
编译器似乎做了一些优化,生成了一个无限循环
我认为((n+17u)>=17u)
并不总是正确的,因为如果n==0xFFFF..FF
,n+17u
将换行为16u
是我错了,还是编译器错了?
gcc
和clang
都编译掉这个循环,用常量1
的printf替换它(使用-O3
)
我认为您观察到的VC行为是一个bug:无符号算术定义良好,您认为溢出应该是小于17的整数,这是对的。因此,
gcc
和clang
要正确处理。MacOS上的gcc和clang:
#include <stdio.h>
int main()
{
unsigned int n=18u;
while ((n+17u)>=17u) {
n-= 17u;
printf("n=%u %u >= %u\n", n, n+17u, 17u);
}
printf("%u\n",n+17u);
return 0;
}
所以n变为“大”,n的增量使其再次变为“小”,循环结束。
我说得不太好
编译器错误很少见,但我想你已经找到了。祝贺你 这可能是未定义的行为。(我对C不太了解,无法确定)我在VS2012中看到了它。已在VS2013中修复。@HansPassant是否有要确认的链接?这很可怕。在VS2012更新4中仍然没有修复。
#include <stdio.h>
int main()
{
unsigned int n=18u;
while ((n+17u)>=17u) {
n-= 17u;
printf("n=%u %u >= %u\n", n, n+17u, 17u);
}
printf("%u\n",n+17u);
return 0;
}
n=1 18 >= 17
n=4294967280 1 >= 17
1