C 中定义的行为是UINT_MAX + 1u
什么?假设它为零有多安全?
问问题
12858 次
4 回答
27
从标准(C11,6.2.5/9,强调我的):
[...] 涉及无符号操作数的计算永远不会溢出,因为无法由结果无符号整数类型表示的结果会以比结果类型可以表示的最大值大一的数字为模减少。
如果UINT_MAX
是10
:
(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
于 2013-02-15T16:35:22.573 回答