PHP 数据类型:整型(integer)
整型
在 PHP 中,整型(integer)是集合 ℤ = {..., -2, -1, 0, 1, 2, ...} 中的某个数。PHP 不支持无符号的整数。
语法
整型支持十进制(decimal)、十六进制(hexadecimal)、八进制(octal)和二进制(binary),前面可以加上符号 -
表示负数,+
表示正数。
要使用八进制表达,数字前必须加上 0
。要使用十六进制表达,数字前必须加上 0x
。要使用二进制表达,数字前必须加上 0b
。
整型语法的结构形式是:
decimal : [1-9][0-9]*
| 0
hexadecimal : 0[xX][0-9a-fA-F]+
octal : 0[0-7]+
binary : 0b[01]+
integer : [+-]?decimal
| [+-]?hexadecimal
| [+-]?octal
| [+-]?binary
例子:
$a = 1234; // 十进制数
$a = -123; // 负数
$a = 0123; // 八进制数 (等于十进制 83)
$a = 0x1A; // 十六进制数 (等于十进制 26)
$a = 0b11111111; // 二进制数字 (等于十进制 255)
一些与整型有关的常量
// 最大值
$intMax = PHP_INT_MAX; // 9223372036854775807
// 整型字长
$intLength = PHP_INT_SIZE; // 8
// 整型最小值
$intMin = PHP_INT_MIN; // -9223372036854775808
整数溢出
整型数的字长和平台有关,32 位平台下通常为 +/- 2^31,64 位平台下,通常为 +/- 2^63,除了 Windows 下 PHP 7 以前的版本,总是 +/- 2^31。
如果给定的一个数超出了 integer 的范围,将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float:
$large_number = 2147483647;
var_dump($large_number); // int(2147483647)
$large_number = 2147483648;
var_dump($large_number); // float(2147483648)
$million = 1000000;
$large_number = 50000 * $million;
var_dump($large_number); // float(50000000000)
转换为整形
要明确地将一个值转换为 integer,可以用 (int)
或 (integer)
强制转换。还可以通过函数 intval()
函数来将一个值转换成整型。
从布尔值转换
FALSE 将产生出 0,TRUE 将产生出 1。
从浮点型转换
当从浮点数转换成整数时,将向下取整。
var_dump((int)3.1); // int(3)
var_dump((int)3.9); // int(3)
如果浮点数超出了整数范围
var_dump((int)(10 * 9223372036854775807)); // int(0)
不要将未知的分数强制转换为整型,会出现无法预期的后果
$a = (0.1+0.7) * 10 ; // 8.0
(int) $a; // 7
从字符串转换
当一个字符串被当作一个数值来取值,其结果和类型如下:
如果该字符串没有包含 '.','e' 或 'E' 并且其数字值在整型的范围之内(由 PHP_INT_MAX 所定义),该字符串将被当成 integer 来取值。其它所有情况下都被作为 float 来取值。
该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 'e' 或 'E' 后面跟着一个或多个数字构成。
$foo = 1 + "10.5"; // $foo is float (11.5)
$foo = 1 + "-1.3e3"; // $foo is float (-1299)
$foo = 1 + "bob-1.3e3"; // $foo is integer (1)
$foo = 1 + "bob3"; // $foo is integer (1)
$foo = 1 + "10 Small Pigs"; // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " + 1; // $foo is float (11)
$foo = "10.0 pigs " + 1.0; // $foo is float (11)
当转换的值超过了 integer 本身的取值范围,则会转为临界值
$large_number = '3120546155123126';
var_dump(intval($large_number)); // int(2147483647)
$large_number = '-3120546155123126';
var_dump(intval($large_number)); //int(-2147483648)