Выбор ответа Senior Типы и неопределённое поведение обновлено

Сдвиги в C++20

Вопрос

Пусть int 32-битный. Какое выражение остаётся неопределённым поведением в C++20?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: 1 << 32. Сдвиг на число бит, большее или равное ширине (после продвижения), а также на отрицательное число остаётся UB. - С C++20 сдвиг знакового влево определён: результат берётся по модулю 2³², 1 << 31 == INTMIN, -1 << 1 == -2. - Сдвиг…

Варианты ответа

  1. 1 << 31
  2. 1 << 32правильный ответ
  3. -8 >> 1
  4. -1 << 1

Разбор

Сдвиг на число бит, большее или равное ширине (после продвижения), а также на отрицательное число остаётся UB.

  • С C++20 сдвиг знакового влево определён: результат берётся по модулю 2³², 1 << 31 == INT_MIN, -1 << 1 == -2.
  • Сдвиг отрицательного вправо с C++20 определён как арифметический: -8 >> 1 == -4.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.