В стандарте C переполнение является исключительным условием , и поведение тогда не определено для стандарта. Из черновика №1570 для С11, 6.5 Выражения § 5:
Если во время вычисления выражения возникает исключительное условие (то есть, если
результат не определен математически или не находится в диапазоне представимых значений для его
тип), поведение не определено.
Это означает, что вы не можете обработать переполнение способом, который будет определен для стандарта. При этом большинство компиляторов просто сохраняют младшие биты результата, которые могут поместиться в представлении типа, и игнорируют биты высшего порядка. Это то, что делают MSVC, gcc и clang.
С этого момента я буду предполагать, что ваша система использует int32_t
(соответственно int16_t
или int64_t
) для подписанного int и игнорирует переполнение. Он не обязателен для каждого стандарта, но достаточно распространен и, вероятно, это то, что делает ваша система.
В вашем коде есть 2 возможных переполнения. Во-первых, это функция scanf
: как говорит @ n.m., Ничего не сказано о поведении этого семейства функций, если входная последовательность не соответствует типу. Я предполагаю, что представленный номер является приемлемым в виде целого числа со знаком (между INT_MIN и INT_MAX). В любом случае, пользователь может обнаружить его просто: просто отобразите x
: если это не просто набранный номер, то произошло переполнение.
Второе здесь:
y = (y * 10) + temp;
Здесь снова легко проверить переполнение, выполнив обратные операции и убедившись, что все в порядке:
int next = (y * 10) + temp;
if ((next < 0) || (y != (next - temp) / 10)) {
// an overflow occured...
...
Теоретически, ничто не может гарантировать, что отрицание положительного int является действительным отрицательным int, но это верно для типов intXX_t
, поэтому этого должно быть достаточно для обнаружения переполнения в функции reverse
.