2014-07-16 11 views
5

Sulla mia macchina PHP_INT_SIZE è 8 ma pack('i',1) restituisce comunque una stringa di 4 byte.Il pacchetto ('i', 1) ha sempre 4 byte?

The docs dire i è un "numero intero con segno (dimensioni dipendenti dalla macchina e ordine in byte)" ma ciò non sembra essere vero. È fissato a 4 byte?

Ciò significa che unpack('i',pack('i',PHP_INT_MAX))[1] !== PHP_INT_MAX su macchine a 64 bit poiché metà dei dati viene interrotta.

+0

Appena riprodotto in Linux a 64 bit, quindi non è necessariamente un problema solo per Windows a causa della mancanza di 64-bit integer. –

+0

"numero intero con segno (dimensioni dipendenti dalla macchina e ordine dei byte)" non significa che la sua dimensione dovrebbe essere uguale a 'PHP_INT_SIZE', anche se è ciò che tutti farebbero tranne. – Holt

risposta

3

È importante ricordare che PHP is written in C (in altre parole, non importa ciò che PHP pensa sia un int). Saltando fuori dell'altro risposta su sizeof(int), sembra come se fosse una reliquia di 32 bit C compilers (sottolineatura mia)

Sì, dipende da entrambi i processori (più precisamente, ISA, set di istruzioni dell'architettura, ad esempio, X 86 e x86-64) e compilatori incluso il modello di programmazione. Ad esempio, nelle macchine a 16 bit, la dimensione di (int) era di 2 byte. Le macchine a 32 bit hanno 4 byte per int. È stato considerato int la dimensione nativa di un processore, ovvero la dimensione del registro . Tuttavia, i computer a 32 bit erano così popolari e il numero enorme di software è stato scritto per il modello di programmazione a 32 bit. Quindi, è sarebbe molto confuso se il computer a 64 bit avrebbe 8 byte per int. Sia Linux che Windows restano 4 byte per int. Tuttavia, differiscono per la lunghezza di .

Quindi, in breve, potrebbe essere 2 byte ma solo se si dispone di un processore a 16 bit. Nei sistemi a 32 e 64 bit, C sembra dire che int è 4 byte in tutti i casi. Quindi, sì, pack('i',1); sarà sempre 4 byte.

1

Sì (principalmente).


dal codice sorgente di PHP (pack.c):

switch ((int) code) { 
    //... 

    case 'i': 
    case 'I': 
     INC_OUTPUTPOS(arg,sizeof(int)) 
     break; 

    //... 
} 

La funzione utilizza sizeof(int) (che nel tuo caso (e la maggior parte dei casi [citazione necessaria]) saranno 4), piuttosto che il valore di PHP_INT_SIZE. Non copre completamente la domanda su "perché?", Ma dal momento che l'idea della funzione è stata presa da Perl, PHP avrebbe potuto optare per funzionalità simili.

+0

No. Ti sbagli. 'sizeof (int)' sarà diverso se ci si trova su una macchina a 32 o 64 bit. –

+0

@true Puoi fornire una citazione per questo? So che non sarà sempre la stessa cosa, ma a me sembra che siano 4 indipendentemente (e risultati simili sono riportati qui: http://stackoverflow.com/questions/589575/size-of-int-long-etc) –

Problemi correlati