Операция сдвига вправо

В этом коде ниже 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 соответственно.

→ Ссылка