UINT_MAX + 1等于什么?

lve*_*lla 12 c standards portability

C中定义的行为是UINT_MAX + 1u什么?假设它为零是多么安全?

net*_*der 24

从标准(C11,6.2.5/9,强调我的):

[...]涉及无符号操作数的计算永远不会溢出,因为无法用结果无符号整数类型表示的结果以比模式结果类型可以表示的最大值大1的数量减少.

如果UINT_MAX10:

(10 + 1) % (10 + 1) == 0
Run Code Online (Sandbox Code Playgroud)

所以,是的,假设它为零是安全的.

  • 标准规定`UINT_MAX`(和其他无符号整数类型的最大值)是'2 ^ N - 1`,其中`N`是类型的宽度,所以10是一个坏例子(但是不是阻止我进行上升). (10认同)
  • 2 ^ 3.4594316186372973-1 (2认同)

pau*_*sm4 9

值得强调的是,虽然无符号行为是明确定义的,但有符号整数溢出不是:

在C编程语言中,带符号的整数溢出会导致未定义的行为,而无符号整数溢出会导致数量减少,模数为2

关于这个主题的一篇非常好的论文:

C/C++整数运算的例子及其结果

Expression             Result
----------             ------
UINT_MAX+1             0
LONG_MAX+1             undefined
INT_MAX+1              undefined
SHRT_MAX+1             SHRT_MAX+1 if INT_MAX>SHRT_MAX, otherwise undefined
char c = CHAR_MAX; c++ varies
-INT_MIN               undefined
(char)INT_MAX          commonly -1
1<<-1                  undefined
1<<0                   1
1<<31                  commonly INT_MIN in ANSI C and C++98; undefined in C99 and C++11
1<<32                  undefined
1/0                    undefined
INT_MIN%-1             undefined in C11, otherwise undefined in practice
Run Code Online (Sandbox Code Playgroud)


小智 5

它是安全的.C标准保证无符号整数溢出环绕结果为零.

  • 严格来说,无符号整数从不溢出只有有符号整数溢出. (2认同)