Un entero es un número perteneciente al conjunto ℤ = {..., -2, -1, 0, 1, 2, ...}.
Los enteros 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 entero 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 entero 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 enteros sin signo.
El tamaño de un entero 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 entero, será interpretado como un número decimal. De la misma manera, una operación que resulte en un número fuera del rango del tipo entero devolverá un número decimal.
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 entero en PHP, para lograr esto
utilizar la función intdiv().
1/2 produce el número decimal (0.5).
El valor puede ser convertido en un entero 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 entero, 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 entero como argumento. Un valor puede también ser convertido en un entero
utilizando la función intval().
Si un resource es convertido a un entero, entonces el resultado será el identificador único del resource asignado por PHP en la ejecución.
Ver también el transtipado.
Al convertir un número decimal en entero, 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 número decimal no integral en entero 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 enteros (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 número decimal no tiene suficiente precisión para dar un resultado entero exacto.
¡No se emite ninguna alerta cuando ocurre este comportamiento!
Nota:
NaN,Infinityy-Infson siempre igual a cero al convertir en int.
Nunca convierta una fracción desconocida en un entero, 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 entero es indefinido desde otros tipos. No reportar ningún comportamiento observado, sabiendo que pueden cambiar sin previo aviso.