Каково заданное поведение в C для UINT_MAX + 1u
? Насколько безопасно предположить, что оно равно нулю?UINT_MAX + 1 равно что?
ответ
От стандартной (С11, 6.2.5/9, курсив мой):
[...] Вычисление с участием беззнаковых операндов никогда не может переполнения, , потому что результат, который не может быть представлен результирующий целочисленный тип без знака равен приведено по модулю число, которое больше одного наибольшего значения, которое может быть , представленное результирующим типом.
UINT_MAX
Если это 10
:
(10 + 1) % (10 + 1) == 0
Так что, да, это с уверенностью предположить, что это ноль.
Стандартные мандаты, что 'UINT_MAX' (и максимальные значения других неподписанных целых типов) - это' 2^N - 1', где 'N' - ширина типа, поэтому 10 - плохой пример (но это doesn ' t остановить меня от выживания). –
2^3.4594316186372973 - 1 – Vortico
Кроме того, '(без знака) -1 == UINT_MAX'; последний может использоваться в препроцессорных условиях, а '(unsigned) -1' может быть оценен только компилятором. – Loic
Это безопасно. Стандарт C гарантирует, что целое число без знака переполнение обертывание приводит к нулю.
И C строго говоря, целые числа без знака никогда не переполняют только переполненные целыми числами. – ouah
@ouah В этом случае, что я должен сказать, что они делают? – 2013-02-15 16:43:43
@ H2CO3: вы могли бы сказать, что они обертываются. –
должны быть безопасными:
Примечание беззнаковая переполнение ИНТ корректно.
Также, здесь whole question.
Стоит подчеркнуть, что в то время как беззнаковое поведение определено корректно, подписал целочисленное переполнение не является:
В языке программирования С, знаковое целое overflow вызывает неопределенное поведение, в то время как неподписанное целочисленное переполнение приводит к уменьшению числа се, силы два
очень хороший документ по теме:
ПРИМЕРОВ С/С ++ целочисленных операциями и их результаты
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. Что означает «равно отрицательному 1» в Python?
- 2. Что делать, если значение _POSIX_VDISABLE равно -1?
- 3. Почему 1% 2 равно 1?
- 4. Первый тест RSPEC, убедитесь, что значение равно 1 или -1
- 5. 1 предположительно не равно 1
- 6. Имеет ли UINT_MAX все биты, установленные в 1?
- 7. Почему rand() производит одинаковое значение при посеве 1 и UINT_MAX?
- 8. Почему FrameLength равно -1?
- 9. Почему _XBEGIN_STARTED равно -1?
- 10. Java Строка конкатенация дает выход как 2 равно 11 на CONCAT 1 + 1 + "равно" + 1 + 1
- 11. Как-то 1 не равно 1 (PHP)
- 12. Rails Rspec integer равно string ("1" == 1)
- 13. Если условие не равно -1
- 14. Если isset userid равно 1?
- 15. (false - NOT (0)) равно 1?
- 16. JQuery: что не равно JQuery, равное «$ (« # myDIV li »). Eq (1)»?
- 17. Гарантировано ли, что False «равно 0» и True «1»?
- 18. Почему "echo [# 10]" равно 1?
- 19. Почему - ~ x равно x + 1?
- 20. Что означает «+ =» (плюс равно)?
- 21. ли C99 позволяют UCHAR_MAX> UINT_MAX
- 22. UINT_MAX так же, как ULONG_MAX в C
- 23. Что делает Java равно() возвращают
- 24. Почему UINT_MAX + 3 всегда равен 2?
- 25. sizeof (void) равно 1 в C?
- 26. Почему {10 + '1'} + 10 равно 10?
- 27. 1 рабочее пространство равно 1 проекту на облаке 9 ide?
- 28. Арифметическое выражение равно 0 вместо 1
- 29. Почему INT_MAX минус INT_MIN равно -1?
- 30. Почему значение 1 ** Inf равно 1, а не NaN?
@JoshPetitt : Это все равно ноль кстати. 'UINT_MAX + 1u' оценивается как целое число без знака, в результате получается' 0', которое затем сохраняется в 'long long'. ;-) – netcoder
@netcoder, на моей 64-разрядной машине Windows вы действительно правы. Мой внутренний компилятор ошибочен. :-) –