UINT_MAX + 1等于什么?
对于UINT_MAX + 1u
,C中定义的行为是什么? 假设它为零是多么安全?
从标准(C11,6.2.5 / 9,强调我的):
[…]涉及无符号操作数的计算永远不会溢出,因为无法用结果无符号整数类型表示的结果以比模式结果类型可以表示的最大值大1的数量减少 。
如果UINT_MAX
为10
:
(10 + 1) % (10 + 1) == 0
所以,是的,假设它为零是安全的。
值得强调的是,虽然无符号行为是明确定义的,但有符号整数溢出不是:
在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
它是安全的。 C标准保证无符号整数溢出环绕结果为零。
应该是安全的:
关于无符号溢出的Wiki
注意unsigned int overflow定义良好。
另外,这是一个完整的问题 。