Сужение типа в 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 и выведите
новую переменную.