PHP 数据类型:整型(integer) 3 个改进

整型

在 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)
本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!