Un entier es un número perteneciente al conjunto ℤ = {..., -2, -1, 0, 1, 2, ...}.
Los entiers pueden ser especificados en notación decimal (base 10), hexadecimal (base 16), octal (base 8), o binaria (base 2). El operador de negación puede ser utilizado para designar un entier negativo.
Para utilizar la notación octal, preceda el número de un 0
(cero).
A partir de PHP 8.1.0, la notación octal puede ser precedida con 0o
o 0O
.
Para utilizar la notación hexadecimal, preceda el número de 0x
.
Para utilizar la notación binaria, preceda el número de 0b
.
A partir de PHP 7.4.0, los enteros literales pueden contener underscores
(_
) entre los dígitos, para una mejor legibilidad
de los literales. Estos underscores son eliminados por el escáner de PHP.
Ejemplo #1 Los enteros literales
<?php
$a = 1234; // un número decimal
$a = 0123; // un número octal (equivalente a 83 en decimal)
$a = 0o123; // un número octal (a partir de PHP 8.1.0)
$a = 0x1A; // un número hexadecimal (equivalente a 26 en decimal)
$a = 0b11111111; // un número binario (equivalente a 255 en decimal)
$a = 1_234_567; // un número decimal (a partir de PHP 7.4.0)
?>
Formalmente, la estructura de un entero literal es a partir de PHP 8.1.0
(anteriormente, los prefijos octales 0o
o 0O
no estaban permitidos, y antes de PHP 7.4.0, los underscores no estaban permitidos.
decimal : [1-9][0-9]*(_[0-9]+)* | 0 hexadecimal : 0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)* octal : 0[oO]?[0-7]+(_[0-7]+)* binary : 0[bB][01]+(_[01]+)* integer : decimal | hexadecimal | octal | binary
El tamaño de un entier es dependiente de la plataforma, sin embargo,
un valor máximo de aproximadamente 2 mil millones es habitual (esto corresponde
a 32 bits con signo). Las plataformas de 64 bits tienen habitualmente un valor
máximo de aproximadamente 9E18.
PHP no soporta los entiers sin signo.
El tamaño de un entier puede ser determinado utilizando la constante
PHP_INT_SIZE
, el valor máximo, utilizando
la constante PHP_INT_MAX
,
y el valor mínimo utilizando la constante
PHP_INT_MIN
.
Si PHP encuentra un número superior al máximo de un entier, será interpretado como un nombre décimal. De la misma manera, una operación que resulte en un número fuera del rango del tipo entier devolverá un nombre décimal.
Ejemplo #2 Desbordamiento de entero en un sistema de 32 bits
<?php
$large_number = 50000000000000000000;
var_dump($large_number); // float(5.0E+19)
var_dump(PHP_INT_MAX + 1); // sistema de 32 bits: float(2147483648)
// sistema de 64 bits: float(9.2233720368548E+18)
?>
No hay operador de división de entier en PHP, para lograr esto
utilizar la función intdiv().
1/2
produce el nombre décimal (0.5
).
El valor puede ser convertido en un entier para redondear hacia cero, o
utilizando la función round() para tener un control
más fino sobre cómo se realiza el redondeo.
Ejemplo #3 División
<?php
var_dump(25/7); // float(3.5714285714286)
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7)); // float(4)
?>
Para convertir explícitamente un valor en un entier, utilizar la palabra clave (int)
, o (integer)
.
Sin embargo, en la mayoría de los casos, esta palabra clave no es necesaria
ya que un valor será automáticamente convertido si un operador, una
función o una estructura de control requiere un entier como argumento. Un valor puede también ser convertido en un entier
utilizando la función intval().
Si un recurso es convertido a un entier, entonces el resultado será el identificador único del recurso asignado por PHP en la ejecución.
Ver también el transtipado.
Al convertir un nombre décimal en entier, el número es redondeado hacia cero. A partir de PHP 8.1.0, se emite una notificación de deprecación al realizar la conversión implícita de un nombre décimal no integral en entier perdiendo precisión.
Ejemplo #4 Conversión desde números flotantes
<?php
function foo($value): int {
return $value;
}
var_dump(foo(8.1)); // "Deprecated: Implicit conversion from float 8.1 to int loses precision" a partir de PHP 8.1.0
var_dump(foo(8.1)); // Antes de PHP 8.1.0
var_dump(foo(8.0)); // 8 en ambos casos
var_dump((int) 8.1); // 8 en ambos casos
var_dump(intval(8.1)); // 8 en ambos casos
?>
Si el número de coma flotante está más allá de los límites de los entiers (habitualmente,
+/- 2.15e+9 = 2^31
en plataformas de 32 bits y
+/- 9.22e+18 = 2^63
en plataformas de 64 bits),
el resultado será indefinido, ya que el nombre décimal no tiene suficiente precisión para dar un resultado entier exacto.
¡No se emite ninguna alerta cuando ocurre este comportamiento!
Nota:
NaN
,Infinity
y-Inf
son siempre igual a cero al convertir en int.
Nunca convierta una fracción desconocida en un entier, esto puede generar resultados inesperados.
<?php
echo (int) ( (0.1+0.7) * 10 ); // Muestra 7 !
?>
Ver también la sección sobre las alertas concernientes a la precisión de los números de coma flotante.
Si una cadena es
numérica
o numérica de cabeza entonces será transformada en su valor entero
correspondiente, de lo contrario será convertida a cero (0
).
El comportamiento de la conversión en entier es indefinido desde otros tipos. No reportar ningún comportamiento observado, sabiendo que pueden cambiar sin previo aviso.