对于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返回-1?
- 2. 为什么“1”等于“+1”?
- 3. 为什么_XBEGIN_STARTED等于-1?
- 4. 为什么0.1 * 10-1不等于0?
- 5. 为什么NUM = 1 - - “2” 等于3个
- 6. 为什么 - 〜x等于x + 1?
- 7. 为什么1字节等于8位?
- 8. 为什么{10 +'1'} + 10等于10?
- 9. 为什么recordset.RecordCount等于1但recordset.EOF和recordset.BOF都等于True
- 10. 长和int等于,等于什么()
- 11. Filemaker:Script“等于1”
- 12. 为什么Clojure中的(/ 1/2)等于2N?
- 13. 什么是CSS的表中等于border =“1”?
- 14. 为什么-2 >>> 1等于2147483647的Java
- 15. 为什么1/10等于零,除非我使用变量?
- 16. Python中的matlab排列(A,[3 2 1])等价于什么?
- 17. 为什么字节b =(字节)0xFF等于整数-1?
- 18. 布尔等于-1
- 19. 什么时候|不等于|?
- 20. 为什么'^ 9等于9?
- 21. 为什么FLT_MIN等于零?
- 22. 什么是或等于
- 23. 是什么KEYEVENTF_SILENT等同于
- 24. 为什么总是等级是1?
- 25. int * p = somearray但(p + 1)不等于somearray的地址[1]。为什么?
- 26. OpenGL - 怎么做,以便1点等于1像素
- 27. C99是否允许UCHAR_MAX> UINT_MAX
- 28. GCC宏1 + 1不等于2?
- 29. ADO.RecordCount等于-1问题
- 30. 删除方法等于1
@JoshPetitt :顺便说一下,这仍然是零。 'UINT_MAX + 1u'被评估为一个无符号整数,得到'0',然后存储在'long long'中。 ;-) – netcoder 2013-02-15 16:49:19
@netcoder,在我的Windows 64位机器上,您确实是正确的。我的内部编译器有缺陷。 :-) – 2013-02-15 16:58:52