Interi

Un int è un numero che appartiene all'insieme ℤ = {..., -2, -1, 0, 1, 2, ...}.

Vedere anche:

Syntax

Gli int possono essere specificati nella notazione decimale (base 10), esadecimale (base 16), ottale (base 8) o binaria (base 2). L'operatore di negazione può essere utilizzato per indicare un int negativo.

Per usare la notazione ottale, anteporre uno 0 (zero) al numero. Per usare la notazione esadecimale, anteporre 0x. Per usare la notazione binaria, anteporre 0b.

A partire da PHP 7.4.0, gli interi letterali possono contenere trattini bassi (_) tra le cifre, per una migliore leggibilità dei letterali. Questi trattini bassi vengono rimossi dallo scanner di PHP.

Example #1 Interi letterali

<?php
$a
= 1234; // numero decimale
$a = 0123; // numero ottale (equivalente a 83 decimale)
$a = 0x1A; // numero esadecimale (equivalente a 26 decimale)
$a = 0b11111111; // binary number (equivalent to 255 decimal)
$a = 1_234_567; // decimal number (a partire da PHP 7.4.0)
?>

Formalmente, la struttura per gli int letterali è a partire da PHP 7.4.0 (in precedenza, i trattini bassi non erano consentiti):

decimal     : [1-9][0-9]*(_[0-9]+)*
            | 0

hexadecimal : 0[xX][0-9a-fA-F]+(_[0-9a-fA-F]+)*

octal       : 0[0-7]+(_[0-7]+)*

binary      : 0[bB][01]+(_[01]+)*

integer     : decimal
            | hexadecimal
            | octal
            | binary

La dimensione di un int dipende dalla piattaforma, anche se il valore massimo tipico è di circa due miliardi (corrispondente a 32 bit col segno). Le piattaforme a 64 bit hanno normalmente un valore massimo di circa 9E18. PHP non supporta gli int senza segno. La dimensione di un int può essere determinata usando la costante PHP_INT_SIZE, il valore massimo usando la costante PHP_INT_MAX, ed il valore minimo usando la costante PHP_INT_MIN.

Integer overflow

Se PHP incontra un numero oltre i limiti del tipo int, questo verrà interpretato con un float. Allo stesso modo, un'operazione che restituisce un numero oltre i limiti del tipo int restituirà invece un float.

Example #2 Overflow di interi in un sistema a 32 bit

<?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)
?>

Example #3 Overflow di interi in un sistema a 64 bit

<?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)
?>

Non esiste un operatore di divisione int in PHP, per ottenere ciò utilizzare la funzione intdiv(). 1/2 produce il float 0.5. Il valore può essere convertito in un int per arrotondarlo verso lo zero, oppure la funzione round() fornisce un controllo più preciso sull'arrotondamento.

<?php
var_dump
(25/7); // float(3.5714285714286)
var_dump((int) (25/7)); // int(3)
var_dump(round(25/7)); // float(4)
?>

Convertire in intero

Per convertire esplicitamente un valore in int, usare o (int) oppure (integer). Comunque, nella maggior parte dei case questo non è necessario, in quanto un valore verrà automaticamente convertito se un operatore, fuinzione o struttura di controllo richiede un argomento int. Un valore può essere convertito in int anche con la funzione intval().

Se un resource è convertito in int, allora il risultato sarà il numero unico di risorsa assegnato al resource da PHP a runtime.

Vedere anche: manipolazione dei tipi.

Dai booleani

false corrisponde a 0 (zero), e true a 1 (uno).

Da numeri in floating point

Quando si converte da float a int, il numero verrà arrotondato towards zero.

Se il float è oltre i limiti di int (di solito +/- 2.15e+9 = 2^31 sulle piattaforme 32-bit e +/- 9.22e+18 = 2^63 sulle piattaforme 64-bit), il risultato non è definito, dal momento che float non ha abbastanza precisione per dare un risultato int esatto. Nessun allarme, neanche un avvertimento viene generato quando questo avviene!

Nota:

NaN e Infinity saranno sempre zero quando convertiti in int.

Avviso

Non effettuare mai un cast di una frazione sconosciuta a int, dal momento che questo a volte può portare a risultati inattesi.

<?php
echo (int) ( (0.1+0.7) * 10 ); // stampa 7!
?>

Vedere anche l'avvertimento a proposito della precisione dei float.

Da stringhe

Se la stringa è numerica o inizia con numeri allora verrà risolta nel valore intero corrispondente, altrimenti verrà convertita a zero (0).

Da NULL

null è sempre convertito a zero (0).

Da altri tipi

Attenzione

Il comportamento della conversione a int non è definito per gli altri tipi. Non fare affidamento a alcun comportamento osservato, dal momento che questo può cambiare senza preavviso.