Операция сдвига вправо
В этом коде ниже res будет равно -2.
int main()
{
int res = -28299 >> 14;
}
В этом коде ниже res будет равно 1. Почему?
int main()
{
int res = 28299 >> 14;
}
Ответы (1 шт):
Возьмём для упрощения 16-битный int. Упомянутые числа в битовом представлении будут выглядеть следующим образом:
| десятичный вид | двоичный вид |
|---|---|
| -28299 | 1001'0001'0111'0101 |
| +28299 | 0110'1110'1000'1011 |
Оператор >> обеспечивает в данном случае арифметический сдвиг вправо на указанное кол-во разрядов. Это значит, что знаковый бит будет повторяться при сдвиге (для отрицательного числа 1, для положительного 0) и использоваться в качестве заполнителя на пустом месте. Получится такой результат (жирным выделены биты, которые "остались" от исходного числа после сдвига):
| десятичный вид | двоичный вид |
|---|---|
| -28299 >> 14 | 1111'1111'1111'1110 |
| +28299 >> 14 | 0000'0000'0000'0001 |
Учитывая способ представления отрицательных чисел в виде дополнительного кода, получим -2 и +1 соответственно.