Выбор ответа Senior Типы и неопределённое поведение обновлено
Сдвиги в C++20
Вопрос
Пусть int 32-битный. Какое выражение остаётся неопределённым поведением в C++20?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: 1 << 32. Сдвиг на число бит, большее или равное ширине (после продвижения), а также на отрицательное число остаётся UB. - С C++20 сдвиг знакового влево определён: результат берётся по модулю 2³², 1 << 31 == INTMIN, -1 << 1 == -2. - Сдвиг…
Варианты ответа
1 << 311 << 32правильный ответ-8 >> 1-1 << 1
Разбор
Сдвиг на число бит, большее или равное ширине (после продвижения), а также на отрицательное число остаётся UB.
- С C++20 сдвиг знакового влево определён: результат берётся по модулю 2³²,
1 << 31 == INT_MIN,-1 << 1 == -2. - Сдвиг отрицательного вправо с C++20 определён как арифметический:
-8 >> 1 == -4.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Типы и неопределённое поведение»
- Порядок байтов: перевернуть uint32 и посчитать единицы
- Умножение int64 с проверкой переполнения
- Середина двух int64 без переполнения
- std::bit_cast
- Что C++20 изменил для знаковых целых
- Порядок вычисления аргументов функции
- Объясни, что такое неопределённое поведение
- Продвижение unsigned char