Perl сдвиг бит проблема - PullRequest
       3

Perl сдвиг бит проблема

4 голосов
/ 02 декабря 2010

У меня проблема при попытке сдвинуть бит на отрицательное число с помощью Perl. Например:

printf("%d", (-10) >> 2);

Этот метод печати: 1073741821

При том же условии, когда я пытаюсь сделать это с помощью Javascript:

document.write('test: ' + (-10 >> 2) + '<br>');

Выход -3

Я хотел бы понять разницу между Perl и Javascripts. Есть ли в Perl проблемы со смещением бита для отрицательного числа?

Большое спасибо.

Ответы [ 2 ]

10 голосов
/ 02 декабря 2010

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
8 голосов
/ 02 декабря 2010

Если это опция, вы можете исправить это подписанное смещение вправо с помощью use integer.

Например:

use integer;
printf("%d", (-10) >> 2);

... дает правильный результат (-3).

С perlop :

Обратите внимание, что и "<<", и ">>" в Perl реализованы напрямую с использованием "<<" и ">> "в C. Если действует use integer (см. Целочисленная арифметика), то используются целые числа со знаком C, в противном случае используются целые числа без знака.В любом случае, реализация не будет генерировать результаты, превышающие размер целочисленного типа, который был создан Perl (32 или 64 бита).

Для получения дополнительной информации см. целое число perldoc .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...