Thi*_*ker 5 php math absolute-value
看来,在32位OS中ip2long返回signed int,在64位OS中返回unsigned int.
我的应用程序正在处理10台服务器,有些是32位,有些是64位,所以我需要它们以同样的方式工作.
在PHP文档中有一个技巧可以使结果始终无符号,但由于我的数据库已经充满了数据,我想让它签名.
那么如何在PHP中将unsigned int更改为已签名的int?
Pau*_*xon 15
PHP不支持无符号整数作为类型,但是你可以做的只是将ip2long的结果转换为unsigned int 字符串,方法是让sprintf将值解释为unsigned %u:
$ip="128.1.2.3";
$signed=ip2long($ip); // -2147417597 in this example
$unsigned=sprintf("%u", $signed); // 2147549699 in this example
Run Code Online (Sandbox Code Playgroud)
编辑,因为你真的希望它甚至在64位系统上进行签名 - 这里是你如何将64位+ ve值转换为32位签名的等价物:
$ip = ip2long($ip);
if (PHP_INT_SIZE == 8)
{
if ($ip>0x7FFFFFFF)
{
$ip-=0x100000000;
}
}
Run Code Online (Sandbox Code Playgroud)