Информация об изменениях

Сообщение Re[3]: несколько вопросов по С++ от 13.12.2019 8:22

Изменено 13.12.2019 9:28 Шахтер

Re[3]: несколько вопросов по С++
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Шахтер, Вы писали:


S>>>есть ли в современном С++ что либо позволяюшее определить что целочисленная операция даст переполнение (или надо каждый раз самому проверять как в Си)

Ш>>Ручками.

Ш>>
Ш>>    result=a+b;
Ш>>    carry=(result<a);
Ш>>


R>Помнинся, этот вопрос уже обсуждался несколько лет назад и тогда мне убедительно показали, со ссылками на стандарт, что такой подход порождает UB.


Нет, не порождает. Это совершенно правильный код. Семантика операций беззнаковых целочисленных типов однозначно определена стандартом.

R>Ну и второй момент. Как быть, если это не a + b, а выражение произвольной сложности?


Можно обернуть UInt в структуру, и определить все операции. Признак переполнения переносить между операциями.
Но это в общем случае не нужно. Как правило, на практике достаточно элементарных вещей тип сложения и умножения.
Re[3]: несколько вопросов по С++
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, Шахтер, Вы писали:


S>>>есть ли в современном С++ что либо позволяюшее определить что целочисленная операция даст переполнение (или надо каждый раз самому проверять как в Си)

Ш>>Ручками.

Ш>>
Ш>>    result=a+b;
Ш>>    carry=(result<a);
Ш>>


R>Помнинся, этот вопрос уже обсуждался несколько лет назад и тогда мне убедительно показали, со ссылками на стандарт, что такой подход порождает UB.


Нет, не порождает. Это совершенно правильный код. Семантика операций беззнаковых целочисленных типов однозначно определена стандартом.

R>Ну и второй момент. Как быть, если это не a + b, а выражение произвольной сложности?


Можно обернуть UInt в структуру, и определить все операции. Признак переполнения переносить между операциями.
Но это в общем случае не нужно. Как правило, на практике достаточно элементарных вещей тип сложения и умножения.

Update.

У меня есть пример такой реализации.

тип SLen