C++ 当变量达到最大值时,递增unsigned int是否会导致未定义的行为

C++ 当变量达到最大值时,递增unsigned int是否会导致未定义的行为,c++,c,int,C++,C,Int,我的代码中有一个计数器,当计数器达到无符号int max值时,我希望计数器返回0。我用一个小代码进行了测试,它可以工作,但我不知道这是否是一个未定义的行为 #include <stdio.h> #include <string.h> main() { unsigned int a = 0; a= ~a; // Max value of unsigned int printf("%u \n", a ); a= a+1; //is it allowed t

我的代码中有一个计数器,当计数器达到无符号int max值时,我希望计数器返回0。我用一个小代码进行了测试,它可以工作,但我不知道这是否是一个未定义的行为

#include <stdio.h>
#include <string.h>

main()
{
  unsigned int a = 0;
  a= ~a; // Max value of unsigned int 
  printf("%u \n", a );
  a= a+1; //is it allowed to increment "a" when "a" reach the Max ? 
  printf("%u \n", a ); // display 0

}
#包括
#包括
main()
{
无符号整数a=0;
a=~a;//无符号int的最大值
printf(“%u\n”,a);
a=a+1;//当“a”达到最大值时,是否允许增加“a”?
printf(“%u\n”,a);//显示0
}
是的,无符号整数从不溢出(这是C术语)。因此,
UINT_MAX+1
被定义为行为,并被评估为
0

(C99,6.2.5p9)“涉及无符号操作数的计算永远不会溢出,因为不能由结果无符号整数类型表示的结果将被减少为比结果类型可以表示的最大值大一的数的模。”


无符号算术定义为模运算,模为
2^位==MAX+1
。因此,增加最大值定义为零

另一方面,有符号溢出确实给出了未定义的行为


这是C和C++中的情况。

你能解释一下,如果减法的结果是否定的,这也意味着无符号算术围绕“向后”吗?
a= a+1; //is it allowed to increment "a" when "a" reach the Max ?