Почему это утверждение верно в PHP?
-
06-07-2019 - |
Вопрос
Я не понимаю, почему это утверждение в PHP повторяет 'whaaa?' -- (0x0F | 0xF0)
должно быть 0xFF
нет?
if((0x0FFFFFFF | 0xF0FFFFFF) != 0xFFFFFFFF) echo 'whaaa?';
Решение
Результат работы этого скрипта:
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 преобразует float в int для or, результатом является int, но следующее шестнадцатеричное преобразование является float, и значения не совпадают.
Чтобы преобразовать значение с плавающей точкой в целое число побитовым способом, ИЛИ оно с 0x0:
var_dump((0xFFFFFFFF | 0x0));
var_dump(((0x0FFFFFFF | 0xF0FFFFFF)) != (0xFFFFFFFF | 0x0));
приводит к
int(-1)
bool(false)
-Адам
Другие советы
Проверьте это, написав var_dump ((0x0FFFFFFF | 0xF0FFFFFF))