



PHP中可以处理有符号整数,包括负整数、零和正整数。整数的处理范围与long类型(C语言类型)相同。32位平台中,整数的处理范围是-2 147 483 648~+2 147 483 647,即-2 32 ~+2 32 -1;64位平台中,整数的处理范围是-9 223 372 036 854 775 808 ~+9 223 372 036 854 775 807,即-2 64 ~+2 64 -1。
在PHP中,数字字面量除了常用的十进制,还可以使用其他进制的整数,如:
● 十六进制,使用0x开始的数值表示十六进制数,如0x1F表示十进制的31。
● 八进制,数字0开始的数值表示八进制数,如011表示十进制的9。
● 二进制,使用0b开始的数值表示二进制数,如0b1111表示十进制的15。
下面的代码演示了不同进制数值的字面量。
<?php
echo 15,"<br>";
echo 0x1F,"<br>";
echo 011,"<br>";
echo 0b1111;
?>
代码执行结果见图3-1,所有数字都以对应的十进制数输出。
图 3-1
PHP中的算术运算包括:
● 加法运算,使用+运算符。
● 减法运算,使用-运算符。
● 乘法运算,使用*运算符。
● 除法运算,使用/运算符。如果不能整除,会返回包含小数部分的结果(浮点数)。
● 模运算,又称为取余数运算。使用%运算符,用于计算整数相除的余数,如果运算数不是整数,则自动转换为整数后计算。
● **运算符,求某数的次方,如2**3的结果为8。这是PHP 5.6新增的运算符。
下面的代码演示了这些算术运算的应用。
<?php
$x = 5;
$y = 3;
echo "$x + $y = ",$x+$y,"<br>";
echo "$x - $y = ",$x-$y,"<br>";
echo "$x * $y = ",$x*$y,"<br>";
echo "$x / $y = ",$x/$y,"<br>";
echo "$x % $y = ",$x%$y,"<br>";
echo "$x ** $y = ",$x**$y,"<br>";
?>
代码执行结果见图3-2。
图 3-2
数值在运算过程中,可能会出现无效的结果,此时,需要关注一个特殊值,即NaN,它表示“不是一个数值”(not a number)。判断NaN值时可以使用is_nan()函数,如is_nan($x)返回true,表示$x不是一个数值,并且不能转换为数值。
下面的代码使用is_nan()函数测试字符串内容是否可以转换为数值,然后使用intval()函数将字符串转换为整数。
<?php
$s = "123";
var_dump(is_nan($s));
echo "<br>";
$x = intval($s);
var_dump($x);
?>
代码执行结果见图3-3。
图 3-3
接下来介绍几种整数特有的操作。
和很多C风格编程语言一样,PHP中也包括增量运算和减量运算,其原理也是相同的,下面先来看增量运算。
增量运算又分为前增量和后增量,它们的区别在于表达式的值。前增量运算时,变量会先执行加1操作,然后返回表达式的值,这样,表达式和变量的值都是原值加1,如下面的代码。
<?php
$i = 1;
echo ++$i, "<br />" , $i;
?>
执行代码会显示两个2,即表达式和变量的值都是$i加1后的结果。
后增量运算时,表达式会先返回变量的值,然后进行变量加1的操作,如下面的代码。
<?php
$i = 1;
echo $i++, "<br />" , $i;
?>
执行代码会显示1和2,即表达式先返回$i变量的值1,然后进行加1操作,最终$i变量的值是2。
减量运算同样分为前减量运算和后减量运算,只不过它执行的是减1的操作,如下面的代码演示了后减量运算的应用。
<?php
$i = 1;
echo $i--,"<br>";
echo $i;
?>
执行代码会显示1和0,即$i--表达式会先返回1,然后进行$i变量减1的操作。
位运算是对整数二进制位进行运算。PHP中的位运算包括:
● 按位与运算,使用&运算符,两个二进制位上的值都是1时,运算结果为1,否则为0。
● 按位或运算,使用|运算符,两个二进制位上的值有一个是1时,运算结果为1,两个数据都是0时,运算结果为0。
● 按位取反运算,使用~运算符,1取反得0,0取反得1。
● 按位异或运算,使用^运算符,两个二进制位上的值一个为1,另一个为0时,结果为1,两个数据相同时,结果为0。
● 位左移运算,使用<<运算符,如16<<2就是将16的二进制位向左(高位)移动2位,低位补0,相当于执行16*2*2的操作,可以理解为x<<n执行了x=x×2 n 运算。
● 位右移运算,使用>>运算符,将数据的二进制位向右(低位)移动,高位补0。如x>>n执行的就是x=x÷2 n 运算。
下面的代码显示了这些位运算的操作。
<?php
$x = 0b0110;
$y = 0b1010;
echo decbin(($x & $y)),"<br />";
echo decbin(($x | $y)),"<br />";
echo decbin((~$y)),"<br />";
echo decbin(($x ^ $y)),"<br />";
echo decbin(($x << 2)),"<br />";
echo decbin(($x >> 2));
?>
代码执行结果见图3-4。
图 3-4
结果并不难理解,只是第三行按位取反的结果需要解释下,大家可以数数有几位数。64位!暴露作者使用的平台了。在64位平台上,整数是64位的,那么1010前面的60位是60个0,取反后是60个1,如图3-4中显示的结果。
需要整数不同进制的形式时,可以使用数学模块中的相关函数,如:
● base_convert()函数,任意进制之间的转换。参数一指定需要转换的数据(字符串类型);参数二指定源数据进制(整数类型);参数三指定目标进制(整数类型)。函数会返回转换后的结果(字符串类型)。
● decbin()函数,十进制数转换为二进制数。
● decoct()函数,十进制数转换为八进制数。
● dechex()函数,十进制数转换为十六进制数。
● bindec()函数,二进制数转换为十进制数。
● octdec()函数,八进制数转换为十进制数。
● hexdec()函数,十六进制数转换为十进制数。
● bin2hex()函数,二进制数转换为十六进制数。
● hex2bin()函数,十六进制数转换为二进制数。
下面的代码演示了base_convert()函数的使用。
<?php
echo base_convert("f1",16,2);
?>
本例中,将十六进制数的f1转换为二进制数形式,代码执行结果见图3-5。
图 3-5
下面的代码演示了十进制数和十六进制数之间的转换,其中使用了dechex()和hexdec()函数。
<?php
echo dechex(128),"<br>";
echo hexdec("1F");
?>
代码执行结果见图3-6。
图 3-6