Translate

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:

0111111111111111111111111111111111111111111111111111111111111111

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!!



Commenti

Posta un commento

Post popolari in questo blog

Retro-restoring Amstrad PCW 8512

Installazione Gotek su Amstrad PCW 9512

Amiga 600 with Gayle ver.1, VHDL code to implement PAL chip (XU1)