Почему это утверждение верно в PHP? - PullRequest
2 голосов
/ 27 октября 2009

Я не понимаю, почему это утверждение в PHP повторяет "аааа?" - (0x0F | 0xF0) должно быть 0xFF нет?

if((0x0FFFFFFF | 0xF0FFFFFF) != 0xFFFFFFFF) echo 'whaaa?';

Ответы [ 2 ]

1 голос
/ 27 октября 2009

Результат этого скрипта:

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

1 голос
/ 27 октября 2009

Проверьте это, написав var_dump((0x0FFFFFFF | 0xF0FFFFFF))

...