Сообщение Re[3]: несколько вопросов по С++ от 13.12.2019 8:22
Изменено 13.12.2019 9:28 Шахтер
Re[3]: несколько вопросов по С++
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, Шахтер, Вы писали:
S>>>есть ли в современном С++ что либо позволяюшее определить что целочисленная операция даст переполнение (или надо каждый раз самому проверять как в Си)
Ш>>Ручками.
Ш>>
R>Помнинся, этот вопрос уже обсуждался несколько лет назад и тогда мне убедительно показали, со ссылками на стандарт, что такой подход порождает UB.
Нет, не порождает. Это совершенно правильный код. Семантика операций беззнаковых целочисленных типов однозначно определена стандартом.
R>Ну и второй момент. Как быть, если это не a + b, а выражение произвольной сложности?
Можно обернуть UInt в структуру, и определить все операции. Признак переполнения переносить между операциями.
Но это в общем случае не нужно. Как правило, на практике достаточно элементарных вещей тип сложения и умножения.
R>Здравствуйте, Шахтер, Вы писали:
S>>>есть ли в современном С++ что либо позволяюшее определить что целочисленная операция даст переполнение (или надо каждый раз самому проверять как в Си)
Ш>>Ручками.
Ш>>
Ш>> result=a+b;
Ш>> carry=(result<a);
Ш>>
R>Помнинся, этот вопрос уже обсуждался несколько лет назад и тогда мне убедительно показали, со ссылками на стандарт, что такой подход порождает UB.
Нет, не порождает. Это совершенно правильный код. Семантика операций беззнаковых целочисленных типов однозначно определена стандартом.
R>Ну и второй момент. Как быть, если это не a + b, а выражение произвольной сложности?
Можно обернуть UInt в структуру, и определить все операции. Признак переполнения переносить между операциями.
Но это в общем случае не нужно. Как правило, на практике достаточно элементарных вещей тип сложения и умножения.
Re[3]: несколько вопросов по С++
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, Шахтер, Вы писали:
S>>>есть ли в современном С++ что либо позволяюшее определить что целочисленная операция даст переполнение (или надо каждый раз самому проверять как в Си)
Ш>>Ручками.
Ш>>
R>Помнинся, этот вопрос уже обсуждался несколько лет назад и тогда мне убедительно показали, со ссылками на стандарт, что такой подход порождает UB.
Нет, не порождает. Это совершенно правильный код. Семантика операций беззнаковых целочисленных типов однозначно определена стандартом.
R>Ну и второй момент. Как быть, если это не a + b, а выражение произвольной сложности?
Можно обернуть UInt в структуру, и определить все операции. Признак переполнения переносить между операциями.
Но это в общем случае не нужно. Как правило, на практике достаточно элементарных вещей тип сложения и умножения.
Update.
У меня есть пример такой реализации.
тип SLen
R>Здравствуйте, Шахтер, Вы писали:
S>>>есть ли в современном С++ что либо позволяюшее определить что целочисленная операция даст переполнение (или надо каждый раз самому проверять как в Си)
Ш>>Ручками.
Ш>>
Ш>> result=a+b;
Ш>> carry=(result<a);
Ш>>
R>Помнинся, этот вопрос уже обсуждался несколько лет назад и тогда мне убедительно показали, со ссылками на стандарт, что такой подход порождает UB.
Нет, не порождает. Это совершенно правильный код. Семантика операций беззнаковых целочисленных типов однозначно определена стандартом.
R>Ну и второй момент. Как быть, если это не a + b, а выражение произвольной сложности?
Можно обернуть UInt в структуру, и определить все операции. Признак переполнения переносить между операциями.
Но это в общем случае не нужно. Как правило, на практике достаточно элементарных вещей тип сложения и умножения.
Update.
У меня есть пример такой реализации.
тип SLen