2013-02-15 2 views
10

Каково заданное поведение в C для UINT_MAX + 1u? Насколько безопасно предположить, что оно равно нулю?UINT_MAX + 1 равно что?

+3

@JoshPetitt : Это все равно ноль кстати. 'UINT_MAX + 1u' оценивается как целое число без знака, в результате получается' 0', которое затем сохраняется в 'long long'. ;-) – netcoder

+0

@netcoder, на моей 64-разрядной машине Windows вы действительно правы. Мой внутренний компилятор ошибочен. :-) –

ответ

21

От стандартной (С11, 6.2.5/9, курсив мой):

[...] Вычисление с участием беззнаковых операндов никогда не может переполнения, , потому что результат, который не может быть представлен результирующий целочисленный тип без знака равен приведено по модулю число, которое больше одного наибольшего значения, которое может быть , представленное результирующим типом.

UINT_MAX Если это 10:

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

Так что, да, это с уверенностью предположить, что это ноль.

+9

Стандартные мандаты, что 'UINT_MAX' (и максимальные значения других неподписанных целых типов) - это' 2^N - 1', где 'N' - ширина типа, поэтому 10 - плохой пример (но это doesn ' t остановить меня от выживания). –

+1

2^3.4594316186372973 - 1 – Vortico

+0

Кроме того, '(без знака) -1 == UINT_MAX'; последний может использоваться в препроцессорных условиях, а '(unsigned) -1' может быть оценен только компилятором. – Loic

5

Это безопасно. Стандарт C гарантирует, что целое число без знака переполнение обертывание приводит к нулю.

+2

И C строго говоря, целые числа без знака никогда не переполняют только переполненные целыми числами. – ouah

+0

@ouah В этом случае, что я должен сказать, что они делают? – 2013-02-15 16:43:43

+1

@ H2CO3: вы могли бы сказать, что они обертываются. –

8

Стоит подчеркнуть, что в то время как беззнаковое поведение определено корректно, подписал целочисленное переполнение не является:

В языке программирования С, знаковое целое 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 
Смежные вопросы