15

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

4

4 回答 4

27

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

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

如果UINT_MAX10

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

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

于 2013-02-15T16:35:54.400 回答
12

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

在 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
于 2013-02-15T16:37:56.793 回答
5

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

于 2013-02-15T16:35:16.537 回答
2

应该是安全的:

关于无符号溢出的 Wiki

注意 unsigned int 溢出是明确定义的。

另外,这是一个完整的问题

于 2013-02-15T16:35:22.573 回答