• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Info Massimo numero intero processabile in PHP

MarcoGrazia

Nuovo utente
Autore del topic
25 Agosto 2015
23
0
Miglior risposta
0
Questa mattina mentre stavo cercando una soluzione per un mio problema mi sono inbattuto in una cosa riguardante il PHP che vorrei condividere con voi, in quanto ritengo interessante.
Come sapete il PHP ha un bel numero di costanti predefinito che coprono molti aspetti della programmazione con questo linguaggio; in
Perfavore, Entra oppure Registrati per vedere i Link!
potete vederli tutti e sotto di essi c'è una piccola spiegazione su cosa forniscono.

Dato che stavo cercando un modo per limitare i danni di un numero passato via get mi sono imbattuto in una discussione su Stackoverflow proprio riguardando il mio problema ed ho scoperta la costante PHP_INT_MAX, ma soprattutto dell'uso che se può fare.
Il "tipo" la utilizzava per poter verificare se un numero fornito via get fosse o meno all'interno del range di numeri gestibili del PHP:
PHP:
Perfavore, Entra oppure Registrati per vedere i codici!
dove $number è il numero passato via GET.

Manco a dirlo questo ha scatenata la mia curiosità e infatti mi sono messo a fare delle prove ed ho scoperto una cosa curiosa:
PHP:
Perfavore, Entra oppure Registrati per vedere i codici!
Sulla macchina in prova un windows 7 a 32 bit con php e apache 2. PHP_INT_MAX ha come valore massimo 2147483647.
La prima volta che ho usato il mio programma di prova ho messo come number 12 e il confronto mi ha restituito 12 come doveva avvenire, ma quando ho passato il numero che vedete, cioè un numero oltre il valore contenuto in PHP_INT_MAX è andato in palla!
Mi ha restituito 21474836470 cioè invece di 2miliardi eccetera è diventato 21miliardi eccetera; guardando il risultato si vede che restituisce 2147483647 con uno zero alla fine.
Provando con 2147483670 mi da 214748364722 cioè 22 oltre il numero max.
In pratica la macchina fa un calcolo semplicissimo; nel primo caso 48 è maggiore di un'unità rispetto a 47 e infatti aggiunge un'unità al numero max diventando 470, nel secondo caso è maggiore di 23 e infatti aggiunge 22, cioè 22 + 0 ( che qui è un'unità e va contato come uno quindi 23 ) in pratica conta quante unità oltre il massimo intero processabile e poi le aggiunge alla cifra.
E' il limite del PHP installato sulla macchina dell'esempio e non è superabile in nessun modo.
Ma non è finita qui, ho aggiunto al mio script questa istruzione:
PHP:
Perfavore, Entra oppure Registrati per vedere i codici!
non mi aspettavo che la processasse e infatti non l'ha fatto, non esce nulla perché un numero maggiore di PHP_INT_MAX non è processabile!

Concludendo, possiamo solo conoscere qual'è il massimo intero processabile dalla versione del PHP montato sul nostro server ma oltre a questo non ci serve a molto altro.
Io volevo controllare che un GET che fornisse un numero intero non superasse un numero troppo grande e per farlo pensavo di usare
PHP:
Perfavore, Entra oppure Registrati per vedere i codici!
ma non è possibile perché se $numero è ben maggiore di PHP_INT_MAX questo impalla il PHP.
 
Questa mattina mentre stavo cercando una soluzione per un mio problema mi sono inbattuto in una cosa riguardante il PHP che vorrei condividere con voi, in quanto ritengo interessante.
Come sapete il PHP ha un bel numero di costanti predefinito che coprono molti aspetti della programmazione con questo linguaggio; in
Perfavore, Entra oppure Registrati per vedere i Link!
potete vederli tutti e sotto di essi c'è una piccola spiegazione su cosa forniscono.

Dato che stavo cercando un modo per limitare i danni di un numero passato via get mi sono imbattuto in una discussione su Stackoverflow proprio riguardando il mio problema ed ho scoperta la costante PHP_INT_MAX, ma soprattutto dell'uso che se può fare.
Il "tipo" la utilizzava per poter verificare se un numero fornito via get fosse o meno all'interno del range di numeri gestibili del PHP:
PHP:
Perfavore, Entra oppure Registrati per vedere i codici!
dove $number è il numero passato via GET.

Manco a dirlo questo ha scatenata la mia curiosità e infatti mi sono messo a fare delle prove ed ho scoperto una cosa curiosa:
PHP:
Perfavore, Entra oppure Registrati per vedere i codici!
Sulla macchina in prova un windows 7 a 32 bit con php e apache 2. PHP_INT_MAX ha come valore massimo 2147483647.
La prima volta che ho usato il mio programma di prova ho messo come number 12 e il confronto mi ha restituito 12 come doveva avvenire, ma quando ho passato il numero che vedete, cioè un numero oltre il valore contenuto in PHP_INT_MAX è andato in palla!
Mi ha restituito 21474836470 cioè invece di 2miliardi eccetera è diventato 21miliardi eccetera; guardando il risultato si vede che restituisce 2147483647 con uno zero alla fine.
Provando con 2147483670 mi da 214748364722 cioè 22 oltre il numero max.
In pratica la macchina fa un calcolo semplicissimo; nel primo caso 48 è maggiore di un'unità rispetto a 47 e infatti aggiunge un'unità al numero max diventando 470, nel secondo caso è maggiore di 23 e infatti aggiunge 22, cioè 22 + 0 ( che qui è un'unità e va contato come uno quindi 23 ) in pratica conta quante unità oltre il massimo intero processabile e poi le aggiunge alla cifra.
E' il limite del PHP installato sulla macchina dell'esempio e non è superabile in nessun modo.
Ma non è finita qui, ho aggiunto al mio script questa istruzione:
PHP:
Perfavore, Entra oppure Registrati per vedere i codici!
non mi aspettavo che la processasse e infatti non l'ha fatto, non esce nulla perché un numero maggiore di PHP_INT_MAX non è processabile!

Concludendo, possiamo solo conoscere qual'è il massimo intero processabile dalla versione del PHP montato sul nostro server ma oltre a questo non ci serve a molto altro.
Io volevo controllare che un GET che fornisse un numero intero non superasse un numero troppo grande e per farlo pensavo di usare
PHP:
Perfavore, Entra oppure Registrati per vedere i codici!
ma non è possibile perché se $numero è ben maggiore di PHP_INT_MAX questo impalla il PHP.

In verità con il codice che stai utilizzando non stampa un numero maggiore a PHP_INT_MAX, ma tu hai due echo
PHP:
Perfavore, Entra oppure Registrati per vedere i codici!
e
PHP:
Perfavore, Entra oppure Registrati per vedere i codici!
quindi la stampa che ritrovi e la semplice concatenazione dei due echo ed il meccanismo che hai descritto e quello dell'and bit a bit che applichi poco prima (che è diverso dall'overflow).
Se fai una cosa di questo tipo
PHP:
Perfavore, Entra oppure Registrati per vedere i codici!
Viene stampato il minor numero negativo rappresentabile su 32 bit.
La cosa interessante di php è che in caso ti trovi una cosa simile
PHP:
Perfavore, Entra oppure Registrati per vedere i codici!
L'intero viene rappresentato sottoforma di float... aumentando sempre il valore della variabile si arriva ad un limite superiore che è il dato Infinito
 
Si l'ho pensato pure io ma non avevo ancora provato a considerare un anello in cui l'unità successiva a PHP_INT_MAX fosse l'ultimo intero negativo PHP_INT_MIN.
anche perché il casting avveniva qui: $number = (int) ($number < 0 ? 1 : ($number & PHP_INT_MAX)); prima dell'echo.
Resta il fatto che non è possibile fare un confronto perché comunque non da risultato.
quanto ai due echo non ti seguo :-D uno era per visualizzare il max numero intero, l'altro quello che ho inserito io arbitrariamente per le prove.
 
Si l'ho pensato pure io ma non avevo ancora provato a considerare un anello in cui l'unità successiva a PHP_INT_MAX fosse l'ultimo intero negativo PHP_INT_MIN.
anche perché il casting avveniva qui: $number = (int) ($number < 0 ? 1 : ($number & PHP_INT_MAX)); prima dell'echo.
Resta il fatto che non è possibile fare un confronto perché comunque non da risultato.
quanto ai due echo non ti seguo :-D uno era per visualizzare il max numero intero, l'altro quello che ho inserito io arbitrariamente per le prove.

Il casting lo fai sull'and bit a bit, quindi il numero non va in overflow, ma va fa ripartire il "conteggio" da 0
Il confronto ovviamente non puoi farlo perchè non puoi rappresentare un tipo intero maggiore di PHP_INT_MAX
Per gli echo mi riferisco a questo
Mi ha restituito 21474836470 cioè invece di 2miliardi eccetera è diventato 21miliardi eccetera; guardando il risultato si vede che restituisce 2147483647 con uno zero alla fine.
Il risultato che tu hai visto deriva da due echo diversi; il primo stampa 2147483647, l'altro 0