Valore minimo di una costante intera in PHP
In PHP il minimo intero a 64 bit vale esattamente -9223372036854775808 (costante PHP_INT_MIN), che equivale a -2^63 o anche 1 << 63. La sua rappresentazione binaria è la seguente:
1000000000000000000000000000000000000000000000000000000000000000
L'intero più grande è 9223372036854775807 (costante PHP_INT_MAX) equivalente a 2^63-1 o anche 1 << 63 - 1. Questa è la sua rappresentazione binaria:
Detto questo, la seguente assegnazione dovrebbe create una variable di tipo int, pari al valore specificato:
$x = -9223372036854775808;
Invece $x sarà un double, anziché un int. Infatti il risultato di:
var_dump($x);
Sarà:
double(-9.2233720368548E+18)
La costante intera assegnata a $x è stata convertita in double, perché?
La motivazione sta nel fatto che l'operatore unario "-" è applicato subito dopo che la costante intera è stata letta. Dato che la costante specificata è superiore al massimo intero (9223372036854775808 > 9223372036854775807) allora questa viene convertita subito in double e solo successivamente resa negativa dall'operatore "-". Il risultato dell'espressione resterà quindi un double.
Lo stesso non succede specificando il minimo direttamente tramite la costante intera PHP_INT_MIN, in quanto questa è già negativa:
$x = PHP_INT_MIN;
var_dump($x);
Risultato:
int(-9223372036854775808)
Non ci sono problemi neanche specificando il massimo intero in quanto questo rientra nel campo dei valori ammessi:
$x = 9223372036854775807;
var_dump($x);
Risultato:
int(9223372036854775807)
A chi interessa tutto ciò? A me, perché mentre scrivevo un interprete PHP per un sistema embedded non capivo perché nel mio parser potevo specificare direttamente una costante con il minimo valore intero, mentre in Zend PHP no. Ora lo so, le costanti intere sono sempre positive!!
molto interessante
RispondiEliminaGiusto!!!
RispondiElimina