Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpPmCvNr 60 of 390 menu
◀ ▶

Сужение типа в C++

Сужение - это запись числа в тип, куда оно может не поместиться. Если число в тип входит, оно остается собой. Если не входит, лишние биты не сохраняются, и на экране уже другое число.

У short верхний край равен 32767, нижний равен -32768. Отдельного числа 32768 в этом типе нет. Шаг за верхним краем попадает на нижний, как у круга битов.

Сложение short компилятор считает в более широком int. Там 32768 помещается. Порча случается, когда результат кладут обратно в short. Перед записью его явно преобразуют через static_cast.

Возьмем верхний край short, прибавим единицу в int и запишем сумму обратно:

short num1 = 32767; int num2 = num1 + 1; num1 = static_cast<short>(num2); std::cout << num2 << "\n"; // выведет 32768 std::cout << num1 << "\n"; // выведет -32768

В num2 еще лежит правильное 32768. В num1 после записи уже -32768.

С нижнего края шаг такой же. Отнимем единицу от -32768 и запишем результат обратно в short:

short num = -32768; num = static_cast<short>(num - 1); std::cout << num << "\n"; // выведет 32767

Число, которое в тип входит, при записи не меняется. Положим 20 из int в short:

int num1 = 20; short num2 = num1; std::cout << num2 << "\n"; // выведет 20

Широкое long long в int тоже может не войти. Возьмем число больше двух миллиардов и запишем его в int. Точное значение после сужения заранее не угадывают. На экране будет уже не оно:

long long num1 = 9000000000000LL; int num2 = num1; std::cout << num2 << "\n"; // выведет 2043514880

Дана переменная:

short num = 32766;

Прибавьте 1, запишите результат в эту же переменную через static_cast и выведите ее.

Дана переменная:

short num = 32767;

Прибавьте 1, запишите результат в эту же переменную через static_cast и выведите ее.

Дана переменная:

short num = -32768;

Отнимите 1, запишите результат в эту же переменную через static_cast и выведите ее.

Дана переменная:

int num = 100;

Запишите ее в переменную short и выведите новую переменную.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить