Результат этого скрипта:
var_dump((0x0FFFFFFF));
var_dump((0xF0FFFFFF));
var_dump((0x0FFFFFFF | 0xF0FFFFFF));
var_dump((0xFFFFFFFF));
var_dump(((0x0FFFFFFF | 0xF0FFFFFF)) != (0xFFFFFFFF));
есть
int(268435455)
float(4043309055)
int(-1)
float(4294967295)
bool(true)
PHP преобразует шестнадцатеричные числа больше 31 бита в числа с плавающей точкой, поскольку целое число подписано, и поэтому может содержать только 31 положительный бит.
Шестнадцатеричные числа без знака, поэтому преобразование имеет смысл.
Первая операция «или» преобразует число с плавающей точкой в целое число, так как не имеет смысла выполнять «или» с плавающей точкой. Таким образом, PHP преобразует число с плавающей точкой в int для или, результатом является int, но следующее шестнадцатеричное преобразование - это число с плавающей точкой, и значения не совпадают.
Чтобы преобразовать число с плавающей точкой в целое число поразрядным образом, ИЛИ с 0x0:
var_dump((0xFFFFFFFF | 0x0));
var_dump(((0x0FFFFFFF | 0xF0FFFFFF)) != (0xFFFFFFFF | 0x0));
результат в
int(-1)
bool(false)
-Adam