int a=-7;
a<<=1;
a>>=1;
printf("%d\n",a);
10000111
00001110
00000111
если я правильно понял знак хранится в первом бите
Дополнительный код позволяет заменить операцию вычитания на операцию сложения и сделать операции сложения и вычитания одинаковыми для знаковых и беззнаковых чисел, чем упрощает архитектуру ЭВМ.
В данном случае при первом сдвиге всё работает, как и задумано, потому что число без знака. Во втором случае компилятор VSE2013 оставляет знак.
Сдвиг влево является логическим сдвигом (биты, сдвигаемые с конца отбрасываются, включая бит знака)
3.3.7 Bitwise shift operators
...
The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1
has an unsigned type or if E1 has a signed type and a nonnegative
value, the value of the result is the integral part of the quotient of
E1 divided by the quantity, 2 raised to the power E2 . If E1 has a
signed type and a negative value, the resulting value is
implementation-defined.