Почему делает сдвиг вправо в возврате PHP отрицательное число?

Я пытаюсь запросить bittorrent средство отслеживания и использую, распаковывают для получения списка дюйм/с от ответа. Так, что-то вроде этого:

$ip = unpack("N", $peers);
$ip_add = ($ip[1]>>24) . "." . (($ip[1]&0x00FF0000)>>16) . "." . (($ip[1]&0x0000FF00)>>8) . "." . ($ip[1]&0x000000FF);

Но по некоторым причинам я получаю следующие IP-адреса, когда я печатаю $ip_add:

117.254.136.66
121.219.20.250
-43.7.52.163

Кто-либо знает то, что могло идти не так, как надо?

5
задан Charles 24 December 2012 в 21:17
поделиться

2 ответа

используйте long2ip () , чтобы преобразовать число обратно в ip

10
ответ дан 18 December 2019 в 10:43
поделиться

Как говорит zerkms, long2ip делает то, что вы хотите. Чтобы ответить на ваш вопрос, >> - это арифметический сдвиг вправо (названный так, потому что $ i >> $ j эквивалентно арифметическому выражению i / 2 j ), который распространяет знаковый бит для сохранения знака числа. То есть $ i <0 iff ($ i >> $ j) <0 . PHP не имеет логического сдвига (но вы можете определить свой собственный ).

5
ответ дан 18 December 2019 в 10:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: