Страницы

Поиск по вопросам

среда, 24 октября 2018 г.

Язык C, преобразование unsigned -> signed

Согласно Стандарту, переполнение знакового есть неопределенное поведение...
Значит ли это, что классический случай:
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

Комментариев нет:

Отправить комментарий