Согласно Стандарту, переполнение знакового есть неопределенное поведение...
Значит ли это, что классический случай:
unsigned int ui = UINT_MAX - rand() % 10;
signed int si = ui;
Является неопределенным поведением?
Где можно найти как можно более полный перечень ситуаций, в которых возможно UB? Пускай и общее описание, без досконального разбора каждого случая.
Ответ
Переполнение при целочисленном преобразовании к знаковому типу не является неопределенным поведением. Результат при таком переполнении определяется реализацией или может привести к сигналу
6.3 Conversions
6.3.1 Arithmetic operands
6.3.1.3 Signed and unsigned integers
[...]
3 Otherwise, the new type is signed and the value cannot be represented in it; either the
result is implementation-defined or an implementation-defined signal is raised.
К неопределенному поведению приводит знаковое целочисленное переполнение при выполнении арифметических вычислений, но не при выполнении целочисленных преобразований.
Перечисление ситуаций, в которых возникает неопределенное поведение можно найти в конце стандарта языка, в приложении J. Раздел J.2 Undefined behavior
Комментариев нет:
Отправить комментарий