2013-02-15 89 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