@maxim_01

Приведение signed int к unsigned int?

Почему при бинарной операции операндов: signed int и unsigned int - первый операнд приводится к unsigned int?
  • Вопрос задан
  • 1482 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Mercury13
Программист на «си с крестами» и не только
Видимо, связано с авариями переполнения. Представьте себе такую штуку: −128 + 255 = 127. Если в процессоре будут аппаратные аварии переполнения, это самое переполнение и произойдёт: −128 − 1 = ???. Беззнаковый тип аварий переполнения не вызывает.

UPD. Так и есть. В Си знаковое переполнение — UB: такое переполнение может разделить с остатком, вызвать аварию или упереться в границы. В GCC есть ключи -ftrapv и -fwrapv — что делать при таком пререполнении.
Беззнаковое — обязательно деление с остатком.

UPD2. Стандарты Си и LIA несколько противоречат друг другу, и можно предположить, что знаковое переполнение зависит от реализации. Это не UB — можно сделать хороший код, полагающийся на такое поведение. Но если x86 так поступает, то не обязательно, что так поступают все.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы