Fondamentalmente ogni computer moderno è una macchina che spinge un po '. Solitamente spinge bit in cluster di dati, chiamati byte, parole, parole o qword.
Un byte è composto da 8 bit, una parola 2 byte (o 16 bit), una parola dword 2 (o 32 bit) e una parola dword 2 dwords (o 64 bit). Questi non sono l'unico modo per organizzare i bit. Anche la manipolazione a 128 bit e 256 bit si verifica, spesso nelle istruzioni SIMD.
Le istruzioni di assemblaggio funzionano su registri e gli indirizzi di memoria di solito operano in uno dei moduli sopra.
ALU (unità logiche aritmetiche) operano su tali pacchetti di bit come se rappresentassero numeri interi (di solito il formato Complemento di due) e FPU come se fossero valori in virgola mobile (di solito in stile IEEE 754 float
e double
) . Altre parti agiranno come se fossero dati in bundle di alcuni formati, caratteri, voci di tabelle, istruzioni della CPU o indirizzi.
Su un tipico computer a 64 bit, i pacchetti di 8 byte (64 bit) sono indirizzi. Visualizziamo questi indirizzi convenzionalmente come in un formato esadecimale (come 0xabcd1234cdef5678
), ma questo è solo un modo semplice per gli umani di leggere i pattern di bit. Ogni byte (8 bit) è scritto come due caratteri esadecimali (equivalentemente ciascun carattere esadecimale - da 0 a F - rappresenta 4 bit).
Ciò che sta effettivamente accadendo (per un certo livello di realtà) è che ci sono bit, di solito memorizzati in un registro o memorizzati in posizioni adiacenti in un banco di memoria, e stiamo solo cercando di descriverli a un altro umano.
Il puntatore consiste nel chiedere al controller di memoria di fornirci alcuni dati in quella posizione. Normalmente chiedi al controller di memoria un determinato numero di byte in una determinata posizione (beh, implicitamente in una serie di posizioni, di solito contigue) e viene fornito attraverso vari meccanismi in cui non entrerò.
Il codice di solito specifica una destinazione per i dati da recuperare - un registro, un altro indirizzo di memoria, ecc. e di solito è una cattiva idea caricare dati in virgola mobile in un registro che si aspetta un intero, o viceversa .
Il tipo di dati in C / C ++ è qualcosa di cui il compilatore tiene traccia e modifica il codice generato. Di solito non c'è nulla di intrinseco nei dati che lo renda effettivamente di qualsiasi tipo. Solo una raccolta di bit (disposti in byte) che vengono manipolati in modo intero (o in modo simile al float o in un modo simile a un indirizzo) dal codice.
Ci sono delle eccezioni a questo. Ci sono architetture in cui certe cose sono un tipo diverso di bit. L'esempio più comune sono le pagine di esecuzione protette - mentre le istruzioni che dicono alla CPU che cosa fanno sono bit, in fase di esecuzione le pagine (di memoria) contenenti codice da eseguire sono contrassegnate appositamente, non possono essere modificate e non è possibile eseguire pagine che non sono marcate come pagine di esecuzione.
Ci sono anche dati di sola lettura (a volte memorizzati nella ROM che non possono essere scritti fisicamente!), problemi di allineamento (alcuni processori non possono caricare double
s dalla memoria a meno che non siano allineati in particolari modi o istruzioni SIMD che richiedono certe allineamento) e miriadi di altre stranezze di architettura.
Anche il livello di dettaglio di cui sopra è una bugia. I computer non "spingono" realmente i bit, stanno davvero spintonando tensioni e corrente. Queste tensioni e correnti a volte non fanno ciò che si suppone debbano fare a livello di astrazione dei bit. I chip sono progettati per rilevare la maggior parte di tali errori e correggerli senza che l'astrazione di livello superiore debba esserne a conoscenza.
Anche quella è una bugia.
Ogni livello di astrazione nasconde quello sottostante e ti consente di pensare a risolvere i problemi senza dover tenere a mente i diagrammi di Feynman per stampare "Hello World"
.
Quindi, a un livello sufficiente di onestà, i computer spingono i bit e a questi bit viene dato un significato in base al modo in cui vengono utilizzati.