對於UINT_MAX + 1u
,C中定義的行爲是什麼?如何安全地假設它是零?UINT_MAX + 1等於什麼?
回答
從標準(C11,6.2.5/9,重點煤礦):
[...]涉及無符號的操作數的一種計算可以永遠不會溢出,因爲 不能由表示的結果得到的無符號整數類型是 減少的模數,該數大於最終值 所代表的最大值,由最終類型表示。
如果UINT_MAX
是10
:
(10 + 1) % (10 + 1) == 0
所以,是的,它是安全的假設它是零。
它很安全。 C標準保證無符號整數溢出環繞結果爲零。
和C嚴格來說,無符號整數永遠不會溢出只有有符號整數溢出。 – ouah 2013-02-15 16:41:48
@ouah在這種情況下,我應該怎麼說呢? – 2013-02-15 16:43:43
@ H2CO3:你可以說他們環繞着。 – 2013-02-15 17:03:49
值得強調的是,雖然無符號行爲被明確定義,簽署整數溢出是不是:
在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
- 1. 爲什麼UINT_MAX + 3總是等於2?
- 2. 爲什麼UINT_MAX返回-1?
- 3. 爲什麼「1」等於「+1」?
- 4. 爲什麼_XBEGIN_STARTED等於-1?
- 5. 爲什麼1%2等於1?
- 6. python爲什麼「BABAB」.count(「BAB」)等於1?
- 7. 爲什麼爲i等於-1
- 8. 爲什麼是真等於-1
- 9. 爲什麼0.1 * 10-1不等於0?
- 10. 爲什麼NUM = 1 - - 「2」 等於3個
- 11. 爲什麼1字節等於8位?
- 12. 爲什麼{10 +'1'} + 10等於10?
- 13. 爲什麼「echo [#10]」等於1?
- 14. 爲什麼 - 〜x等於x + 1?
- 15. 爲什麼recordset.RecordCount等於1但recordset.EOF和recordset.BOF都等於True
- 16. C爲什麼3除以2等於0,而是1等於1?
- 17. 長和int等於,等於什麼()
- 18. Filemaker:Script「等於1」
- 19. 保證RAND_MAX <= UINT_MAX?
- 20. 什麼是CSS的表中等於border =「1」?
- 21. 爲什麼1 | 0,2 | 0在JavaScript中等於2?
- 22. 使用cmath時,爲什麼log10(1/4)不等於log10(0.25)?
- 23. 爲什麼0.9不會重複始終等於1
- 24. 爲什麼-2 >>> 1等於2147483647的Java
- 25. 爲什麼一個double 1.0等於一個int 1?
- 26. 爲什麼字節b =(字節)0xFF等於整數-1?
- 27. 在Python中,「等於負1」是什麼意思?
- 28. 爲什麼Clojure中的(/ 1/2)等於2N?
- 29. 爲什麼1/10等於零,除非我使用變量?
- 30. Python中的matlab排列(A,[3 2 1])等價於什麼?
@JoshPetitt :順便說一下,這仍然是零。 'UINT_MAX + 1u'被評估爲一個無符號整數,得到'0',然後存儲在'long long'中。 ;-) – netcoder 2013-02-15 16:49:19
@netcoder,在我的Windows 64位機器上,您確實是正確的。我的內部編譯器有缺陷。 :-) – 2013-02-15 16:58:52