Perl использует двоичное беззнаковое смещение вправо.Если Perl работает на 32-битной архитектуре, вы получите следующее:
-10 == -0xa == 0xfffffff6
0xfffffff6 >> 2 == 0x3ffffffd == 1073741821
Беззнаковое двоичное смещение вправо означает, что старшие (самые жесткие) биты результата равны 0.
JavaScript используетдвоичный сдвиг вправо, расширяющий знак.JavaScript-сдвиги всегда обрабатывают как ввод, так и вывод как 32-битные целые числа.Таким образом, вы получите:
-10 == -0xa == 0xfffffff6
-3 == -0x3 == 0xfffffffd
0xfffffff6 >> 2 == 0xfffffffd == -3
Расширяющий двоичный двоичный сдвиг вправо означает, что старшие (самые жесткие) биты результата копируются из старшего бита исходного значения.
Как у Тим Хенигансказал в своем ответе, можно получить расширяющий знак двоичный сдвиг вправо от Perl, указав use integer;
.Пример:
{ use integer;
printf "%d 0x%x\n", (-10) >> 2, (-10) >> 2; #: -3 0xfffffffd
}
printf "%d 0x%x\n", (-10) >> 2, (-10) >> 2; #: 1073741821 0x3ffffffd