Что происходит, когда i ++ вызывает целочисленное переполнение?

Возможный дубликат:
С ++ переполнение и переполнение

У меня есть следующий код в C ++:

int temp = std::numeric_limits<int>::max();
temp++;

Уверен ли я, что после приращения результат всегда будет <0?

Спасибо

2

Решение

Нет, это не гарантировано. C ++ 03 имеет это сказать в 5 Expressions, paragraph 5:

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

Кроме того, нет ничего в 5.7 Additive operators это изменяет это поведение. Это не изменилось в C ++ 11.

Это для подписанных типов, о чем вы спрашивали в своем вопросе.


Если вы также заинтересованы в неподписанных типах, раздел 3.9.1 Fundamental types, paragraph 4 состояния:

Целые числа без знака, объявленные как без знака, должны подчиняться законам арифметики по модулю 2N где n — количество битов в представлении значения этого конкретного размера целого числа (см. сноску 41).

Сноска 41: Это подразумевает, что арифметика без знака не переполняется, поскольку результат, который не может быть представлен результирующим целочисленным типом без знака, уменьшается по модулю на число, которое на единицу больше наибольшего значения, которое может быть представлено результирующим целочисленным типом без знака.

4

Другие решения

Нет, переполнение в целочисленных типах со знаком приводит к неопределенному поведению.

РЕДАКТИРОВАТЬ: В дополнение к цитате Паксдиабло:

3.9.1.

Примечание 46) Это подразумевает, что арифметика без знака не переполняется, потому что
результат, который не может быть представлен результирующим целым числом без знака
тип уменьшается по модулю число, которое на единицу больше наибольшего
значение, которое может быть представлено результирующим целочисленным типом без знака.

3