整数(INT数字类型)的溢出
前几日发现php在计算32位整数时,特别是在计算ip地址时,会在自动转换过程中发生溢出。因此必须在发生自动类型转换前,显式地指定转换成双精度或单精度数字类型。
例如,大于127.255.255.255的ip地址的计算,如果使用整数类型,就会被截断在127.255.255.255,即 2147483647。这是由于PHP的整数类型是32位有符号整数,即正负2147483647。
将数字从数据库中提取出来的过程中,因为Mysql的整数类型是支持32位无符号整数的,即上限是 4294967295,若不加处理地直接使用,比如保存的是 3147483647
$ip=$row[’ip’];
$ip=$ip-1;
echo $ip; //= 2147483646
在自动类型转换的过程中(字符串->整数)的过程中,PHP会自动选择转为整数(intval)而发生溢出。所以这里必须显式地指定转为双精度数字类型。
$ip=doubleval($ip)-1;
echo $ip; //= 3147483646
2007年04月03日 星期二 2:39 上午
hello