Что выведет код 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 ошибок.