PHP вправо сдвиг и отрицательный результат? - PullRequest
2 голосов
/ 15 ноября 2009

Я столкнулся с проблемой при преобразовании некоторого кода C в PHP, особенно при использовании оператора правого сдвига.

edit: в следующих примерах, бит = 0;

Оригинальный код C:

p->param->outBits[bytePtr++] |= codeword >> (9 + bit);

PHP код:

$outBits[$bytePtr++] |= $codeword >> (9 + $bit);

Если я начну с codeword, равным 130728, в C я получу ожидаемый результат -1. В PHP я получаю 255. Я понимаю, что это как-то связано с различием арифметического / логического сдвига, и отрицательный знак не вводится в результате того, что MSB остаются на нуле.

Есть ли "быстрый" способ сделать вышеперечисленное в PHP, который не включает сдвиг? например, с помощью базовой арифметики или подобного, что даст мне ожидаемый ответ?

1 Ответ

3 голосов
/ 15 ноября 2009

Ваша проблема в том, что PHP не имеет типа byte, он имеет только integer, который обычно составляет 32 бита (не 8), поэтому, если вам действительно нужно отрицательное значение (биты в любом случае верны, потому что беззнаковое 255 - это то же самое, что и подписанное -1), тогда вам, вероятно, следует добавить недостающие 24 или использовать арифметику для восстановления отрицательного значения (255 - -1, 254 - -2 и т. д., то есть 256 - x = -x).

...