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

为什么PHP中的右移返回负数?,php,ip-address,bitwise-operators,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); 但是,由于某些原因,我在打印$IP_add时获得了以下

我正在尝试查询bittorrent跟踪器,并使用unpack从响应中获取IP列表。比如说:

$ip = unpack("N", $peers);
$ip_add = ($ip[1]>>24) . "." . (($ip[1]&0x00FF0000)>>16) . "." . (($ip[1]&0x0000FF00)>>8) . "." . ($ip[1]&0x000000FF);
但是,由于某些原因,我在打印$IP_add时获得了以下IP地址:

117.254.136.66
121.219.20.250
-43.7.52.163

有人知道会出什么问题吗?

用于将数字转换回ip

正如zerkms所说,
long2ip
做你想做的事。为了回答您的问题,有一个右移(之所以这样命名是因为
$i>>$j
相当于算术表达式
i/2j
),它传播符号位以保留数字的符号。也就是说,
$i<0
($i>$j)<0
。PHP没有(但您可以这样做)。

试试这个

function decode_ip($str){
    $str = (float)($str);
    $ip = array(
        (int)($str/pow(2,24)),
        (int)($str/pow(2,16) & 0xFF),
        (int)($str/pow(2,8) & 0xFF),
        (int)($str & 0xFF)
    );
    return join(".", $ip);
}

解码ip(“3225422716”)//192.64.11.124

你是救世主!谢谢。在发布后10分钟内无法接受答案:)无论如何,你能告诉我我的方法出了什么问题吗?你必须在计算前将$ip加上2^31($ip+pow(2,31)),我明白了。。。理解。谢谢你的解释。将浏览您提供的信息+我很感激。