Una variabile Integer in C occupa 2 byte o 4 byte?
Dipende dalla piattaforma che stai utilizzando e dalla configurazione del tuo compilatore. L'unica risposta autorevole è usare l' sizeof
operatore per vedere quanto è grande un numero intero nella tua situazione specifica.
Quali sono i fattori da cui dipende?
L'intervallo potrebbe essere considerato meglio, piuttosto che la dimensione . Entrambi varieranno in pratica, anche se è molto più semplice scegliere tipi variabili per intervallo rispetto alle dimensioni, come vedremo. È anche importante notare che lo standard ci incoraggia a considerare la scelta dei nostri tipi di numeri interi in base all'intervallo piuttosto che alle dimensioni , ma per ora ignoriamo la pratica standard e lasciamo che la nostra curiosità esplori sizeof
, byte e CHAR_BIT
e rappresentazione di interi ... scaviamo la tana del coniglio e vederlo da soli ...
sizeof
, byte e CHAR_BIT
La seguente dichiarazione, presa dallo standard C (collegato sopra), descrive questo in parole che non credo possano essere migliorate.
L' sizeof
operatore fornisce la dimensione (in byte) del suo operando, che può essere un'espressione o il nome tra parentesi di un tipo. La dimensione è determinata dal tipo di operando.
Supponendo una chiara comprensione ci condurrà a una discussione sui byte . Si presume comunemente che un byte sia di otto bit, quando in realtà CHAR_BIT
indica quanti bit sono in un byte . Questa è solo un'altra di quelle sfumature che non vengono prese in considerazione quando si parla dei numeri interi a due (o quattro) byte comuni .
Finiamo le cose finora:
sizeof
=> dimensione in byte e
CHAR_BIT
=> numero di bit in byte
Pertanto, a seconda del sistema in uso, sizeof (unsigned int)
potrebbe essere qualsiasi valore maggiore di zero (non solo 2 o 4), come se CHAR_BIT
fosse 16, quindi un singolo byte (sedici bit) contiene abbastanza bit per rappresentare il numero intero a sedici bit descritto dal standard (citati di seguito). Non sono necessariamente informazioni utili, vero? Analizziamo più a fondo ...
Rappresentazione intera
Previsto dalla norma C minimo precisione / gamma per tutti i tipi standard interi (e CHAR_BIT
, anche, FWIW) qui . Da questo, possiamo ricavare un minimo per quanti bit sono necessari per memorizzare il valore , ma possiamo anche semplicemente scegliere le nostre variabili in base agli intervalli . Tuttavia, gran parte dei dettagli richiesti per questa risposta risiede qui. Ad esempio, quanto segue che lo standard unsigned int
richiede (almeno) sedici bit di memoria:
UINT_MAX 65535 // 2¹⁶ - 1
Quindi possiamo vedere che unsigned int
richiedono ( almeno ) 16 bit , che è dove si ottengono i due byte (supponendo che CHAR_BIT
sia 8) ... e in seguito quando il limite è aumentato a 2³² - 1
, le persone hanno invece dichiarato 4 byte. Questo spiega i fenomeni che hai osservato:
La maggior parte dei libri di testo afferma che le variabili intere occupano 2 byte. Ma quando eseguo un programma che stampa gli indirizzi successivi di una matrice di numeri interi mostra la differenza di 4.
Stai usando un antico libro di testo e un compilatore che ti insegna C non portatile; l'autore che ha scritto il tuo libro di testo potrebbe non esserne nemmeno a conoscenza CHAR_BIT
. Si consiglia di aggiornare il proprio libro di testo (e compilatore), e si sforzano di ricordare che si tratta di un campo in continua evoluzione che è necessario rimanere davanti a competere ... Basta parlare di questo, però; vediamo quali altri segreti non portatili memorizzano quei byte interi sottostanti ...
I bit di valore sono ciò che le idee sbagliate comuni sembrano contare. L'esempio sopra usa un unsigned
tipo intero che in genere contiene solo bit di valore, quindi è facile perdere il diavolo nei dettagli.
Bit di segno ... Nell'esempio sopra ho citato UINT_MAX
come limite massimo unsigned int
perché è un esempio banale estrarre il valore 16
dal commento. Per i tipi con segno, al fine di distinguere tra valori positivi e negativi (questo è il segno), dobbiamo includere anche il bit del segno.
INT_MIN -32768 // -(2¹⁵)
INT_MAX +32767 // 2¹⁵ - 1
Bit di riempimento ... Sebbene non sia comune incontrare computer con bit di riempimento in numeri interi, lo standard C consente che ciò accada; alcune macchine (cioè questa ) implementano tipi di numeri interi più grandi combinando insieme due valori di numeri interi (con segno) più piccoli ... e quando si combinano numeri interi con segno, si ottiene un bit di segno sprecato. Quel bit sprecato è considerato riempimento in C. Altri esempi di bit di riempimento potrebbero includere bit di parità e bit trap .
Come puoi vedere, lo standard sembra incoraggiare a considerare intervalli come INT_MIN
... INT_MAX
e altri valori minimi / massimi rispetto allo standard quando si scelgono tipi interi e scoraggia il ricorso alle dimensioni in quanto vi sono altri fattori sottili che potrebbero essere dimenticati come CHAR_BIT
e bit di riempimento che potrebbe influire sul valore di sizeof (int)
(ovvero le idee sbagliate comuni degli interi a due e quattro byte trascurano questi dettagli).