Я действительно не могу найти «авторитетный» источник по этому вопросу, главным образом потому, что это, вероятно, вопрос соглашения, а терминология часто очень противоречива. Но следующая выдержка из « Безопасного кодирования в C и C ++ » Роберта Сикорда подводит итог моего понимания ситуации:
Целочисленное переполнение возникает, когда целое число увеличивается за пределы своего максимального значения или уменьшается за пределы своего минимального значения 3 . Целочисленные переполнения тесно связаны с базовым представлением.
Сноска продолжает:
[3] Уменьшение целого числа сверх его минимального значения часто называют целочисленным понижением , хотя технически этот термин относится к условию с плавающей запятой.
Причина, по которой мы называем это целочисленным переполнением, заключается в том, что в типе просто недостаточно места для представления значения. В этом смысле он похож на переполнение буфера (за исключением того, что он фактически не пересекает границу буфера, он обычно демонстрирует поведение циклического перехода. *) С этой точки зрения концептуальной разницы между INT_MIN - 1
и нет INT_MAX + 1
. В обоих случаях в int
типе данных просто недостаточно места для представления любого значения, поэтому мы имеем переполнение .
Также может быть полезно отметить, что в архитектурах процессоров x86 и x86_64 регистр флагов включает бит переполнения . Бит переполнения устанавливается при переполнении целочисленной арифметической операции со знаком. Выражение INT_MIN - 1
установит бит переполнения. (Бита «недополнения» нет.) Очевидно, что инженеры AMD и Intel используют термин «переполнение» для описания результата целочисленной арифметической операции, в которой слишком много битов, чтобы поместиться в тип данных, независимо от того, значение численно слишком велико или слишком мало.
* На самом деле, в С, целочисленное переполнение со знаком является фактически неопределенным поведением, но в других языках, таких как Java, арифметика дополнения двух будет обернута вокруг.
INT_MIN - 1
илиINT_MAX + 1