整型等于集数={…,-2,-1,0,1,2,…}。
语法
整数值int可以用十进制、十六进制、八进制或二进制表示,也可以在前面加上符号(-或+)。可以使用负运算符表示负整型。
要使用八进制表达式,必须在数字前面加上0(零)。PHP8.1.0以后,也可以在8进制表示前加上0o或0O。要使用十六进制表示法,必须在数字前面加上0x。要使用二进制表达式,必须在数字前面加0b。
PHP7.4.0以后,在整数值上下划线(_)中描述的场景,使用以下步骤创建明细表,以便在概念设计中分析体量的体积。
<?php $a = 1234; // 十进制数 $a = 0123; // 八进制数 (等于十进制 83) $a = 0o123; // 八进制数 (PHP 8.1.0 起) $a = 0x1A; // 十六进制数 (等于十进制 26) $a = 0b11111111; // 二进制数字 (等于十进制 255) $a = 1_234_567; // 整型数值 (PHP 7.4.0 以后) ?>
int语法的结构形式如下(在PHP7.4.0之前不支持下划线)。
十进制:[1-9][0-9]*(__[0-9]+)*
十六进制:0[xX][0-9a-fA-F]+(u[0-9a-fA-F]+)*
八进制:0[oO]?[0-7]+(_[0-7]+)*
二进制:0[bB][01]+(__[01]+)*
整数:十进制、16进制、八进制、二进制。
整数int的字大小因平台而异,但通常的最大值约为20亿(带符号的32位)。64位平台的最大值通常在9E18左右。PHP不支持unsigned int。int值的词长等于常数PHP_INT_SIZE表示,最大值为常数PHP_INT_可以用AX表示,最小值是常数PHP_INT_可以用MIN表示。
整数溢出
如果指定的数值超出整型范围,则解释为浮点。如果运算结果超出整型范围,则返回浮点。
示例2 32位系统中的整数溢出:
<?php $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) ?>
示例3 64位系统中的整数溢出:
<?php $large_number = 9223372036854775807; var_dump($large_number); // int(9223372036854775807) $large_number = 9223372036854775808; var_dump($large_number); // float(9.2233720368548E+18) $million = 1000000; $large_number = 50000000000000 * $million; var_dump($large_number); // float(5.0E+19) ?>
PHP没有整型除法舍入运算符。请使用intdiv()代替。1/2生成浮点0.5。可以放弃小数部分、将其转换为int或使用根()函数对值进行舍入。
<?php var_dump(25/7); // float(3.5714285714286) var_dump((int) (25/7)); // int(3) var_dump(round(25/7)); // float(4) ?>
转换为整数
要将值显式地转换为int,请使用(int)或(integer)进行转换。但是,大多数情况下不需要分配角色。这是因为如果运算符、函数或流控制假定为int参数,则会自动转换值。也可以使用函数intval()将值转换为int。
如果将资源转换为int,则结果将是PHP运行时分配给资源的唯一资源编号。
从布尔值转换
假返回0(零),真返回1(1)。
float的转换
当浮点浮点数从浮点数浮点转换为整数整型时,将被截断。
如果float不在int范围内(通常在32位平台上+/-2.15e+9=2^31,在64位平台上+/-9.22e+18=2^63),则结果是未知的。定义,因为没有足够的精度来获得精确的整型结果。在这种情况下,没有警告,也没有通知!
提示:
NaN和Infinity在转换为int时为零。
注意:
不要将未知的分数转换为整型。可能会出现意想不到的结果。
<?php echo (int) ( (0.1+0.7) * 10 ); // 显示 7! ?>
从字符串转换
如果字符串是数字或第一个数字,则解析为相应的整型值。否则,将转换为零(0)。
从空值转换
空值转换为零(0)。
来自其他类型的转换
注意:
未定义从其他类型转换为整型的行为。请不要依赖现有行为,因为它会在没有预告的情况下更改。
数字文字的前零表示“这是八进制”。但是,请不要混乱。字符串开头的零是不同的。因此:
$x = 0123; // 83 $y = "0123" + 0 // 123
这里有一些技巧可以将“点”IP地址转换为长整数,并向后转换。这是非常有用的,因为如果数据库表中的IP地址存储为BIGINT而不是字符,那么访问它的速度会快得多。
BIGINT的IP:
<?php $ipArr = explode('.',$_SERVER['REMOTE_ADDR']); $ip = $ipArr[0] * 0x1000000 + $ipArr[1] * 0x10000 + $ipArr[2] * 0x100 + $ipArr[3] ; ?>
IP作为BIGINT从db读回虚线形式:
请记住,PHP整数运算符是整数——不是长的。此外,由于PHP中没有整数除法,我们通过进行位移位来节省一些S-L-O-W地板(<除法>)。我们必须对$ipArr[0]使用floor(/),因为尽管$ipVal存储为长值,$ipVal>>24将对截断的整数值$ipVal进行操作$然而,ipVint是一个很好的整数,因此
我们可以享受比特转换:
<?php $ipVal = $row['client_IP']; $ipArr = array(0 => floor( $ipVal / 0x1000000) ); $ipVint = $ipVal-($ipArr[0]*0x1000000); // for clarity $ipArr[1] = ($ipVint & 0xFF0000) >> 16; $ipArr[2] = ($ipVint & 0xFF00 ) >> 8; $ipArr[3] = $ipVint & 0xFF; $ipDotted = implode('.', $ipArr); ?>
问题:
var_dump((int)010)//产出8 var_dump((int)“010”)//产出10
第一个是八进制符号,所以输出是正确的。但是,当将“010”转换为整数时,该怎么办呢。它也应该是输出8?
解答:
使用(int)转换为整数将始终转换为默认基数,即10。
以这种方式将字符串转换为数字并没有考虑PHP中格式化整数值的多种方式(以零为基数8,以“0x”为基数16,以“0b”为基数2)。它只需查看字符串中的第一个字符,并将其转换为以10为基数的整数。前导零将被去除,因为它们在数值中没有意义,因此您将得到(int)“010”的十进制值10。
使用(int)010在基之间转换整数值将考虑格式化整数的各种方式。010中的前导零表示数字采用八进制表示法,使用(int)010将其转换为以10为基数的十进制值8。
这类似于使用0x10以十六进制(以16为基数)表示法进行写入。使用(int)0x10将将其转换为基数为10的十进制值16,而使用(int)“0x10”将以十进制值0结束:由于“x”不是数值,因此之后的任何值都将被忽略。
如果希望将字符串“010”解释为八进制值,则需要指示PHP这样做。intval(“010”,8)将解释以8为基数的数字,而不是默认的以10为基数的数值,您将以十进制值8结束。您还可以使用octdec(“010”)将八进制字符串转换为十进制值8。另一个选项是使用base_convert(“010,8,10”)显式地将数字“010”从基数8转换为基数10,但是,此函数将返回字符串“8”,而不是整数8。
将字符串转换为整数与intval函数使用的逻辑相同:
使用指定的转换基数(默认为基数10)返回var的整数值。
intval允许指定不同的基数作为第二个参数,而直接转换操作不允许,因此使用(int)将始终将字符串视为基数10。