C/C++

Обработка переполнения в операциях с целыми типами данных в языке С.

Не могу найти информацию по этой теме:(Буду очень благодарен если что-то скинете
Язык C не обрабатывает переполнения. От слова "совсем".
Единственный способ отследить переполнение - в своём коде руками прописывать проверки. Либо значений операндов до выполнения операции, либо результата операции.

Например, если мы складываем положительные числа и после q += r значение q стало отрицательным (для signed) или уменьшилось (для unsigned) - у нас переполнение.
Andrey Biryukov
Andrey Biryukov
63 728
Лучший ответ
Тут интересно пишут «Свод правил по работе с целыми числами в C/C++»
https://habr.com/ru/company/ruvds/blog/551216/
Это чтобы больше желание связываться с си не было :)
А так си наследник ассемблера, так что поведение должно быть близко к нему и решения для переполнения тоже из него берите.
Валерий Берюшов Какой кошмар! Взяли глупую статью и пропустили через Гогол-транслейт. А то, что не перевелось, просто повыкидывали. Лишний раз убеждаюсь, что лучше рекомендаций Криса Касперски на эту тему нет ничего! Очень недооценённый человек. При жизни и до сих пор! ГЛЫБА!
Валерий Берюшов Вообще, грустно наблюдать, как некогда достойный ресурс превращается в подобие Яндекс-Дзен-рекламо-помойки. Специально поднимают со дна всякий отстой, чтобы в комментариях все разоср@лись.
Обрабатывается алгоритмически, хотя можно перейти на ассемблерную вставку или реализовывать библиотеку на ассемблере и проверять аппаратные флаги.

Для примера несколько операций для беззнаковых:
Инкремент - если операнд равен максимальному значению, то переполнение, к старшей части нужно прибавить единицу, нижняя. естественно, обнулится
Сложение - как выше написал Андрей, если значение в младшей части после сложения стало меньше добавляемого операнда, то переполнение, надо добавить единицу в старший.
Умножение - операция не использует признака переполнения, есть формула расчета длинного значения, см иллюстрацию и дальше гуглить "multi-precision multiplication", если проблемы в реализации

Ну, если ассемблерные вставки существуют не для этого, то для чего они тогда вообще нужны? Си + Асм - лучше не сделаешь! Просто проверяешь флаг переноса с помощью JC addr и прыгаешь на обработчик. И ЭТО ВСЁ!