Почему сдвиг 24 бит приводит к отрицательному значению? - PullRequest
3 голосов
/ 09 мая 2019

Когда я выполняю 24-битную смену для числа меньше 256, я получаю отрицательный результат?Почему это так?

console.log( (200<<23)>>23 );

console.log( (200<<24)>>24 ); // ???

1 Ответ

5 голосов
/ 09 мая 2019

Поскольку битовые сдвиги работают в двоичном формате, давайте посмотрим на двоичное представление.Для этих операторов используется 32 бита.

Decimal    | Binary
200        | 0000 0000 0000 0000 0000 0000 1100 1000

Теперь сдвиньте влево на 24 позиции ...

200        | 0000 0000 0000 0000 0000 0000 1100 1000
-939524096 | 1100 1000 0000 0000 0000 0000 0000 0000

Самое главное, обратите внимание, что первый бит теперь равен 1, чтоуказывает отрицательное число в знаковых 32-разрядных числах.

Следующее, что следует отметить, это то, что >> является знаковым смещением смещения вправо.Это означает, что когда вы снова сдвигаетесь вправо, вы сдвигаете копии первого бита.

-939524096 | 1100 1000 0000 0000 0000 0000 0000 0000
-56        | 1111 1111 1111 1111 1111 1111 1100 1000

Однако, если вы вместо этого используете >>>, вы получаете сдвиг вправо с нулевым заполнением.Как следует из названия, оно всегда сдвигается в 0 с.

-939524096 | 1100 1000 0000 0000 0000 0000 0000 0000
200        | 0000 0000 0000 0000 0000 0000 1100 1000
...