Что-то не гуглится...

Nov 25, 2021 18:15

Нужен хелп по программизму C/C++. Сам что-то не смог нагуглить ( Read more... )

Leave a comment

Comments 12

marigranula November 25 2021, 16:13:42 UTC
int32_t z= y / z - тут нет ошибки? Не int32_t z= х / z

Reply

psilogic November 25 2021, 17:39:56 UTC
да, ошибся: y/x= 0x80000000/-1

Reply


kray_zemli November 25 2021, 17:28:49 UTC
Под линуксом там с сигналами что-то можно мутить. Ключик -fnon-call-exceptions позволяет написать в обработчике сигнала throw. Хотя такой подход у красноглазых считается не тру. Под виндой похожий фокус тоже достигается каким-то ключиком, /EH кажется.

Reply

psilogic November 25 2021, 17:47:43 UTC
Нашел: /EHa ловит эти исключения стандартным catch-ем, что решает проблему. Спасибо!

Reply

mcjabberwock November 25 2021, 18:05:09 UTC
man signal
да, пишется sub, перехватчик сигналов

Reply


kray_zemli November 25 2021, 21:02:14 UTC
В одном виндовом математическом пакете видел такую реализацию: функцией set_se_translator устанавливается обработчик исключений, который делает throw. Было это, правда, на 32-битной системе, и с какими ключами там оно компилировалось, уже не вспомнить.

Reply


conti_nues November 26 2021, 08:34:33 UTC
А что такое 0x80000000 как signed int32? Уж не минус один ли?

Reply

psilogic November 26 2021, 08:46:08 UTC
-1 будет 0xffFFffFF

В 32 битах кодируется 232 чисел.
Из них одно - ноль, (231 - 1) положительных и (231) отрицательных. То есть отрицательных на одно больше, и для самого малого отрицательного нет парного положительного.

0x80000000 - это как раз минимальное отрицательное, для которого при смене знака в результате деления результат невозможно представить в 32 битах - это переполнение.

При умножении его на -1 или при операции смены знака также происходит переполнение, но исключение не бросается.

Reply

kray_zemli November 26 2021, 12:25:28 UTC
-2'147'483'648 - самое маленькое число. Самое большое число 2'147'483'647. Поэтому сменить знак у такого числа нельзя.

Reply


metaclass November 27 2021, 06:49:10 UTC
В современном мире серверу модно падать, а потом его кубернетис перезапустит, а пока тот перезапускается - запросы шлются на другую реплику :)
Но на С++ конечно так нельзя, оставишь UB - потом злоумышленники будут в твоем кластере червей разводить.

Reply

metaclass November 27 2021, 06:51:53 UTC
Поэтому бекенд сервис надо делать на go, а запросы на тяжелые вычисления пересылать через mq на сервисы-воркеры.
Заодно придется развести полный девопс, чтобы вот это все запустить, деплоить и обслуживать :)

Reply

psilogic November 27 2021, 08:05:26 UTC
Ну, да, червей не хотелось бы... Хорошо хоть заказчики такие, что их не жалко :)

Reply


Leave a comment

Up