Страницы

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

воскресенье, 15 декабря 2019 г.

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

#c


Согласно Стандарту, переполнение знакового есть неопределенное поведение...

Значит ли это, что классический случай:

unsigned int ui = UINT_MAX - rand() % 10;
signed int si = ui;


Является неопределенным поведением?

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


Ответы

Ответ 1



Переполнение при целочисленном преобразовании к знаковому типу не является неопределенным поведением. Результат при таком переполнении определяется реализацией или может привести к сигналу 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.

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

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