为什么PHP中的右移会返回负数?

Leg*_*end 5 php ip-address bitwise-operators

我正在尝试查询bittorrent跟踪器并使用unpack从响应中获取IP列表.所以,像这样:

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

但是,出于某种原因,当我打印$ ip_add时,我得到以下IP地址:

117.254.136.66
121.219.20.250
-43.7.52.163
Run Code Online (Sandbox Code Playgroud)

有谁知道会出现什么问题?

zer*_*kms 10

使用long2ip()将数字转换回ip


out*_*tis 5

正如zerkms所说,long2ip做你想要的.要回答你的问题,>>算术右移(因为$i >> $j它等同于算术表达式),它传播符号位以保留数字的符号.也就是说,iff.PHP没有逻辑转换(但您可以定义自己的转换).i / 2j$i < 0 ($i >> $j) < 0