UINT_MAX + 1等于什么?

时间:2013-02-15 16:31:56

标签: c standards portability

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

4 个答案:

答案 0 :(得分:23)

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

  

[...]涉及无符号操作数的计算永远不会溢出,    因为得到的无符号整数类型无法表示的结果是   减少模数可以是最大值的数字   由结果类型表示。

如果UINT_MAX10

(10 + 1) % (10 + 1) == 0

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

答案 1 :(得分:9)

值得强调的是,虽然 unsigned 行为定义明确,但 signed 整数溢出不是:

  

在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

答案 2 :(得分:5)

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

答案 3 :(得分:2)

应该是安全的:

Wiki on unsigned overflow

注意unsigned int overflow定义良好。

此外,这里有一个whole question