UINT_MAX + 1等于什么?(UINT_MAX + 1 equals what?)

2019-07-19 23:30发布

什么是下定义的行为UINT_MAX + 1u ? 如何安全是假设它是零?

Answer 1:

从标准(C11,6.2.5 / 9,重点煤矿):

[...]涉及无符号的操作数的一种计算可以永远不会溢出,因为不能由所得到的无符号整数类型所表示的结果是减少了模比可以由所得到的类型表示的最大值大一个数量

如果UINT_MAX10

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

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



Answer 2:

值得强调的是,虽然未签名的行为是明确的, 有符号整数溢出是不是:

  • http://en.wikipedia.org/wiki/Integer_overflow

在C程序设计语言,符号的整数溢出导致不确定的行为,而无符号整数溢出导致减少数模二的幂

关于这个问题的一个很好的文件:

  • http://www.cs.utah.edu/~regehr/papers/overflow12.pdf

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


Answer 3:

它是安全的。 C标准保证无符号整数溢出环绕导致零。



Answer 4:

应该是安全的:

维基无符号溢出

请注意,无符号整型溢出是明确界定。

此外,这里有一个整体的问题这一点。



文章来源: UINT_MAX + 1 equals what?