vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2024-09-01 10:41 pm

Арифметика с переполнением

Как сложить/вычесть/умножить два числа на Си и отловить факт переполнения? Не теоретически, а по делу. Желательно не теряя эффективности.

Для этого в компиляторах GCC и Clang есть соответствующие встроенные функции.

[personal profile] vsold_1986 2024-09-02 07:13 am (UTC)(link)
Интересно, что в борланде подобные вопросы автоматически решались с помощью исключений (exception), и, видимо, их отлов в критических местах с помощью блока catch не приводил к какому-то существенному падению производительности.
Перейдя же на Qt, я с неприятным удивлением обнаружил, что ничего тут не бросается (throw) и подобные ситуации надо обрабатывать ручками.
Очень странно, что в стандарте языка это никак не оговорено, поскольку ситуация типичная и очень требует универсального решения.

[personal profile] chabapok 2024-09-02 08:30 am (UTC)(link)
> Очень странно, что в стандарте языка это никак не оговорено, поскольку ситуация типичная и очень требует универсального решения.

в с23 есть "#include
[Error: Irreparable invalid markup ('<stdckdint.h>') in entry. Owner must fix manually. Raw contents below.]

> Очень странно, что в стандарте языка это никак не оговорено, поскольку ситуация типичная и очень требует универсального решения.

в с23 есть "#include<stdckdint.h>", там есть всякие ckd_add

(правда это уже как мертвому припарка)
Edited 2024-09-02 08:31 (UTC)
spamsink: (Default)

[personal profile] spamsink 2024-09-02 08:38 am (UTC)(link)
А то, что и деление может давать переполнение (MININT/-1), до тупых не дошло?
juan_gandhi: (Default)

[personal profile] juan_gandhi 2024-09-02 11:27 am (UTC)(link)
Хм, даже не знаю, в JVM вообще есть что-нибудь такое или нет.
sun_jr: (Default)

[personal profile] sun_jr 2024-09-02 03:16 pm (UTC)(link)
Спускаться ниже, к железу, и отлавливать carry bit руками?
juan_gandhi: (Default)

[personal profile] juan_gandhi 2024-09-02 08:28 pm (UTC)(link)
О! Я и не слыхивал. Спасибо за подсказку!