2013-02-15 192 views
10

对于UINT_MAX + 1u,C中定义的行为是什么?如何安全地假设它是零?UINT_MAX + 1等于什么?

+3

@JoshPetitt :顺便说一下,这仍然是零。 'UINT_MAX + 1u'被评估为一个无符号整数,得到'0',然后存储在'long long'中。 ;-) – netcoder 2013-02-15 16:49:19

+0

@netcoder,在我的Windows 64位机器上,您确实是正确的。我的内部编译器有缺陷。 :-) – 2013-02-15 16:58:52

回答

21

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

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

如果UINT_MAX10

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

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

+9

标准要求'UINT_MAX'(和其他无符号整数类型的最大值)是'2^N-1',其中'N'是类型的宽度,所以10是一个不好的例子(但那不是'不要阻止我从upvoting)。 – 2013-02-15 16:56:10

+1

2^3.4594316186372973 - 1 – Vortico 2013-05-31 02:28:49

+0

此外,'(unsigned)-1 == UINT_MAX';后者可用于预处理器条件,而'(unsigned)-1'只能由编译器评估。 – Loic 2015-04-26 19:50:53

5

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

+2

和C严格来说,无符号整数永远不会溢出只有有符号整数溢出。 – ouah 2013-02-15 16:41:48

+0

@ouah在这种情况下,我应该怎么说呢? – 2013-02-15 16:43:43

+1

@ H2CO3:你可以说他们环绕着。 – 2013-02-15 17:03:49

8

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

在C程序设计语言,符号整数溢出导致 未定义的行为,而无符号整数溢出导致编号 减少modu LO两个

非常好的纸关于该主题的功率:

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