这是VC编译器的错误吗?关于无符号整数换行

这是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

我认为下面的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


是我错了,还是编译器错了?

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