Задать вопрос
EgoRusMarch
@EgoRusMarch
C++ Developer

Почему в битовых сдвигах остаётся минус?

Вот такой код:
int a=-7;
a<<=1;
a>>=1; 
printf("%d\n",a);

Двоичное представление -7 (если я правильно понял знак хранится в первом бите):
10000111

Если сделать сдвиг влево, то должно получится:
00001110

Затем сдвиг вправо:
00000111

Что в двоичном представлении равно 7. Но у меня как было -7, так и осталось.
  • Вопрос задан
  • 558 просмотров
Подписаться 3 Оценить 1 комментарий
Решение пользователя Толстый Лорри К ответам на вопрос (6)
@Free_ze
Пишу комментарии в комментарии, а не в ответы
В интернете пишут, что сохранение знака при сдвиге влево зависит от компилятора.
источник:
В данном случае при первом сдвиге всё работает, как и задумано, потому что число без знака. Во втором случае компилятор VSE2013 оставляет знак.


При этом на MSDN пишут про VS2015 и C++:
Сдвиг влево является логическим сдвигом (биты, сдвигаемые с конца отбрасываются, включая бит знака)
Ответ написан
Комментировать