Что выведет код Middle Типы и неопределённое поведение обновлено
Что выведет: преобразования и обрезание
Вопрос
Что выведет программа (C++20, g++ 14)? Каждый вывод с новой строки, как в консоли.
#include <cstdint>
#include <iostream>
int main() {
std::int32_t big = 70000;
std::int16_t small = static_cast<std::int16_t>(big);
std::cout << small << '\n';
double d = -2.7;
std::cout << static_cast<int>(d) << '\n';
std::uint8_t x = 255;
++x;
std::cout << +x << '\n';
}
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: 4464, -2, 0. С C++20 преобразование к знаковому типу вне диапазона определено: берётся значение по модулю 2¹⁶.
Что выведет
4464
-2
0
Разбор
С C++20 преобразование к знаковому типу вне диапазона определено: берётся значение по модулю 2¹⁶. 70000 − 65536 = 4464. Приведение double к int отбрасывает дробную часть к нулю: −2. std::uint8_t при ++ продвигается до int, 256 при записи обратно берётся по модулю 256: 0. Унарный + печатает число, а не символ.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Что выведет: арифметика с char и bool
Следующий вопрос
Что выведет: беззнаковое вычитание и деление
Ещё по теме «Типы и неопределённое поведение»
- Порядок байтов: перевернуть uint32 и посчитать единицы
- Умножение int64 с проверкой переполнения
- Середина двух int64 без переполнения
- std::bit_cast
- Что C++20 изменил для знаковых целых
- Порядок вычисления аргументов функции
- Объясни, что такое неопределённое поведение
- Продвижение unsigned char