integer — неожиданный результат в PHP побитовой операции

Операция 1539 | 0xfffff800 возвращается -509 в JavaScript и Python 2.7.
В PHP я получаю 4294966787,

Кто-нибудь знает почему и может мне это объяснить. Я хотел бы знать, как я получаю ожидаемый результат и в PHP.

4

Решение

1539 | 0xfffff800 = 4294966787 (= 0xFFFFFE03)
Это совершенно верно. Итак, PHP прав.

Если вы хотите иметь как положительные, так и отрицательные целые числа, вам нужен механизм для определения, является ли число отрицательным. Обычно это делается с помощью 2-го числа числа. Вы можете отменить число, просто инвертировав все биты числа, а затем добавив к нему 1. Чтобы избежать неоднозначностей, вы не можете использовать все биты вашей целочисленной переменной. Вы не можете использовать старший бит в этом случае. Старший бит зарезервирован как знаковый бит. (Если вы этого не сделаете, вы никогда не узнаете, является ли ваш номер большим положительным числом или отрицательным числом.)

Например, с помощью 8-битной целочисленной переменной вы сможете представлять числа от 0 до 255. Если вам нужны знаковые значения, вы можете представлять числа от -128 (1000 000 двоичных) до +127 (0111 1111).

В вашем примере у вас есть 32-битное число, для которого установлен самый высокий бит. В Python и JavaScript это интерпретируется как отрицательное число, так как они, по-видимому, имеют 32-битные переменные, и там устанавливается старший бит. Они интерпретируют это как отрицательное число. Итак, результат вашего расчета тоже отрицательный.
В используемой вами версии PHP целочисленная переменная имеет длину 64 бита и используются только младшие 32 бита. Старший бит (бит 63) не установлен, поэтому PHP интерпретирует это число как положительное. В зависимости от того, чего вы хотите достичь, вы можете захотеть заполнить все биты от бита 32 до бита 63 1, что создаст отрицательное число …

1

Другие решения

Других решений пока нет …