PHP правильный сдвиг и отрицательный результат?
Я столкнулся с проблемой при преобразовании некоторого кода C в PHP, в частности, при использовании оператора сдвига вправо.
изменить: в следующих примерах бит =0;
Исходный код C:
p->param->outBits[bytePtr++] |= codeword >> (9 + bit);
PHP-код:
$outBits[$bytePtr++] |= $codeword >> (9 + $bit);
Если я начну с codeword
, равным 130728, в C я получу ожидаемый результат -1. В PHP я получаю 255. Я понимаю, что это как-то связано с различиями в арифметических/логических сдвигах, и отрицательный знак не вводится в результате MSBS остаются на нуле.
Существует ли "быстрый" способ выполнения описанного выше в PHP, который не предполагает переноса? например, с помощью базовой арифметики или аналогичного, это даст мне ожидаемый ответ?
1 answers
Ваша проблема в том, что PHP не имеет типа byte
, у него есть только integer
, который обычно составляет 32 бита (не 8), поэтому, если вам действительно нужно отрицательное значение (биты в любом случае правильные, потому что без знака 255 совпадает со знаком -1), то вам, вероятно, следует добавить недостающие 24 или использовать арифметику для восстановления отрицательного значения (255 равно -1, 254 равно -2 и т. Д. Т.Е. 256 -x = -x).