Вопрос

Я не понимаю, почему это утверждение в 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))

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top