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

zwh*_*nst 6 c unsigned visual-c++

我认为下面的C程序输出1:

#include <stdio.h>
int main()
{
    unsigned int n=18u;
    while ((n+17u)>=17u) n-=17u;
    printf("%u\n",n+17u);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是在VC6,Visual Studio 2010或Visual Studio 2012中编译,都处于发布模式,程序不会输出任何内容而不会退出.

这是VS2012生成的汇编代码:

00BD1000  mov         eax,12h
00BD1005  lea         eax,[eax-11h]
00BD1008  jmp         main+5h (0BD1005h)
Run Code Online (Sandbox Code Playgroud)

似乎编译器做了一些优化并生成了一个无限循环.

我认为((n + 17u)> = 17u)并不总是正确的,因为如果n == 0xFFFF..FF,n + 17u将换行到16u.

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

ric*_*ici 4

gcc并且clang都编译掉该循环,用常量的 printf 替换它1(使用-O3.)

我认为你观察到的 VC 行为是一个错误:无符号算术是明确定义的,你是对的,溢出应该环绕到小于 17 的整数。所以,gccclang对吧。