Se le macchine a 32 bit possono gestire solo numeri fino a 2 ^ 32, perché posso scrivere 1000000000000 (trilioni) senza che la mia macchina si blocchi?


369

I computer a 32 bit possono memorizzare solo numeri interi con segno fino a 2 31 - 1.
Questo è il motivo per cui abbiamo esaurito gli indirizzi IPv4 e siamo entrati nell'era a 64 bit.

Tuttavia, il numero 2 31 - 1 (2.147.483.647) non è grande quanto il numero 1 trilioni (1.000.000.000.000) che sembra essere in grado di visualizzare bene senza il crash della mia macchina.

Qualcuno può spiegare perché questo è?


35
La domanda è difettosa. Le macchine a 32 bit possono gestire numeri molto più grandi di 2 ^ 32. Lo fanno sempre, con "long" e così via. Possono memorizzare solo fino a 2 ^ 32 in un registro, ma il software è scritto per aggirare questo problema. Alcune lingue moderne non hanno nemmeno problemi con la lunghezza di un determinato numero.
JFA,

23
Ti preghiamo di tenere commenti sull'argomento, educati e pertinenti agli aspetti tecnici della domanda. Quasi 50 commenti di battute dovevano già essere rimossi e vorremmo evitare di bloccare il post. Grazie.
nhinkle

6
Questa domanda è stata scritta in un modo un po 'sciatto. Cosa intendi con "scrivi" e "visualizza" il numero 1000000000000? Quando hai scritto la domanda hai scritto il numero 1000000000000 e il tuo browser lo mostra bene, presumo, ma questo non dovrebbe essere niente di strano per nessuno che abbia mai usato un computer prima. La domanda richiede una libera interpretazione.
Ciao Arrivederci

7
Si stima che la coscienza umana contenga circa 50 bit (ho letto da qualche parte). Quindi la domanda non è "Come posso scrivere 10^9senza che il mio PC si blocchi?" ma piuttosto "Come posso scrivere 10^(18)senza che il cervello si blocchi?"
Hagen von Eitzen,

1
I computer a 32 bit possono memorizzare solo numeri UNSIGNED fino a 2 ^ 32 - 1. 2 ^ 32 - 1 non è nemmeno uguale a 2.147.483.647 ... 300 voti positivi e nessuno se ne è reso conto?
Koray Tugay

Risposte:


784

Rispondo alla tua domanda chiedendoti una diversa:

Come contate con le dita fino a 6?

Probabilmente conti fino al numero più grande possibile con una mano e poi passi alla seconda mano quando rimani senza dita. I computer fanno la stessa cosa, se devono rappresentare un valore maggiore di quello che può contenere un singolo registro, useranno più blocchi a 32 bit per lavorare con i dati.


16
Divertente, @codename. In che modo quindi conti sulle tue dita per 32 o più (cioè una volta esaurito 2 ^ 5)? ;) L'analogia del passaggio all'altra mano è buona ... anche se il binario ritarda la necessità di passare all'altra mano. Quello che mi piacerebbe vedere è contare fino a 1.024 o più con la destrezza del pedale per spostarsi in punta di piedi per un ulteriore conteggio in binario - fino a 1.048.575! :) Questo è potenzialmente 20 bit di potenza della scheda figlia. : P
J0e3gan,

14
Si prega di tenere commenti sull'argomento e pertinenti per discutere gli aspetti tecnici di questa risposta. Oltre 60 commenti di battute sono già stati eliminati da questa risposta e vorremmo evitare di bloccare il post.
nhinkle

@ nome in codice: facile, si assegna un dito come puntatore allo stack. Una volta che hai finito le dita, aggiungi la quantità allo stack e riavvii il conteggio.
Makach,

Dove l'hai imparato, @codename? L'ho sentito prima da Frederik Pohl, vedi ad esempio qui hjkeen.net/halqn/f_pohl3.htm
Zane,

2
Penso che questa non sia la risposta alla domanda pertinente. La risposta di @ Bigbio2002 è quella corretta. Qui "1000000000000" non è un numero ma un testo, proprio come "adsfjhekgnoregrebgoregnkevnregj". Quello che stai dicendo è vero, ma credo fermamente che questa non sia la risposta corretta. E vedere così tanti voti positivi ...
Master Chief

398

È corretto che un numero intero a 32 bit non può contenere un valore maggiore di 2 ^ 32-1. Tuttavia, il valore di questo numero intero a 32 bit e il modo in cui appare sullo schermo sono due cose completamente diverse. La stringa stampata "1000000000000" non è rappresentata da un numero intero a 32 bit in memoria.

Per visualizzare letteralmente il numero "1000000000000" sono necessari 13 byte di memoria. Ogni singolo byte può contenere un valore fino a 255. Nessuno di essi può contenere l'intero valore numerico, ma interpretato singolarmente come caratteri ASCII (ad esempio, il carattere ' 0' è rappresentato dal valore decimale 48, valore binario 00110000), possono essere uniti in un formato che ha senso per te, un essere umano.


Un concetto correlato nella programmazione è il typecasting , ovvero il modo in cui un computer interpreterà un particolare flusso di 0s e 1s. Come nell'esempio sopra, può essere interpretato come un valore numerico, un carattere o addirittura qualcos'altro. Mentre un numero intero a 32 bit potrebbe non essere in grado di contenere un valore di 1000000000000, sarà possibile farlo con un numero in virgola mobile a 32 bit, utilizzando un'interpretazione completamente diversa.

Per quanto riguarda il modo in cui i computer possono lavorare e elaborare internamente numeri di grandi dimensioni, esistono numeri interi a 64 bit (che possono contenere valori fino a 16 miliardi di miliardi), valori in virgola mobile e librerie specializzate che possono funzionare con arbitrariamente grandi numeri.


22
In realtà questo è per lo più corretto ma non del tutto. È improbabile che un numero in virgola mobile a 32 punti sia in grado di rappresentare con precisione 1000000000000. Rappresenterà un numero molto vicino al numero desiderato, ma non esattamente.
Tim B,

6
@TimB: hai sentito parlare del formato decimal32? Fa parte dello standard IEEE 754-2008. Questo formato è in grado di rappresentare correttamente questo numero :)
VX

15
Vero, quello può. Tuttavia, questo non è il formato che le persone intendono quando dicono "float", che di solito si riferisce a un numero a virgola mobile a 32 bit come memorizzato e utilizzato dai processori a virgola mobile standard nei computer attuali.
Tim B,

2
@TimB davvero. Il numero più vicino a quello che può essere rappresentato come float32 è
999999995904

4
@TimB: Ma un numero a virgola mobile a 64 bit può rappresentare facilmente 1000000000000esattamente. Sono 10 ^ 12 o 2 ^ 12 * 5 ^ 12; 5 ^ 12 richiede 28 bit di mantissa.
Keith Thompson,

191

Innanzitutto, i computer a 32 bit possono memorizzare numeri fino a 2³²-1 in una sola parola macchina . La parola macchina è la quantità di dati che la CPU può elaborare in modo naturale (ad es. Operazioni su dati di quella dimensione sono implementate nell'hardware e sono generalmente più veloci da eseguire). Le CPU a 32 bit usano parole composte da 32 bit, quindi possono memorizzare numeri da 0 a 2³²-1 in una parola .

In secondo luogo, 1 trilione e 1000000000000 sono due cose diverse.

  • 1 trilione è un concetto astratto di numero
  • 1000000000000 è testo

Premendo 1una volta e poi 012 volte si digita il testo. 1ingressi 1, 0ingressi 0. Vedere? Stai scrivendo personaggi. I personaggi non sono numeri. Le macchine da scrivere non avevano affatto CPU o memoria e gestivano abbastanza bene tali "numeri", perché erano solo testo.

Prova che 1000000000000 non è un numero, ma un testo: può significare 1 trilione (in decimale), 4096 (in binario) o 281474976710656 (in esadecimale). Ha ancora più significati in diversi sistemi. Il significato di 1000000000000 è un numero e memorizzarlo è una storia diversa (torneremo su di esso tra un momento).

Per memorizzare il testo (nella programmazione si chiama stringa ) 1000000000000 sono necessari 14 byte (uno per ogni carattere più un byte NULL di terminazione che sostanzialmente significa "la stringa finisce qui"). Sono 4 parole automatiche. 3 e mezzo sarebbero sufficienti, ma come ho detto, le operazioni sulle parole automatiche sono più veloci. Supponiamo che ASCII sia usato per l'archiviazione del testo, quindi in memoria apparirà così: (convertendo i codici ASCII corrispondenti a 0e 1in binario, ogni parola in una riga separata)

00110001 00110000 00110000 00110000
00110000 00110000 00110000 00110000
00110000 00110000 00110000 00110000
00110000 00000000 00000000 00000000

Quattro caratteri si adattano in una sola parola, il resto viene spostato nella successiva. Il resto viene spostato nella parola successiva fino a quando tutto (incluso il primo byte NULL) si adatta.

Ora, torniamo a memorizzare i numeri. Funziona proprio come con il testo traboccante, ma sono montati da destra a sinistra. Può sembrare complicato, quindi ecco un esempio. Per semplicità supponiamo che:

  • il nostro computer immaginario utilizza decimali anziché binari
  • un byte può contenere numeri 0..9
  • una parola è composta da due byte

Ecco una memoria vuota di 2 parole:

0 0
0 0

Memorizziamo il numero 4:

0 4
0 0

Ora aggiungiamo 9:

1 3
0 0

Si noti che entrambi gli operandi si adatterebbero in un byte, ma non nel risultato. Ma ne abbiamo un altro pronto per l'uso. Ora memorizziamo 99:

9 9
0 0

Ancora una volta, abbiamo usato il secondo byte per memorizzare il numero. Aggiungiamo 1:

0 0
0 0

Whoops ... Si chiama overflow dei numeri interi ed è una causa di molti problemi gravi, a volte molto costosi .

Ma se ci aspettiamo che si verifichi un overflow, possiamo farlo:

0 0
9 9

E ora aggiungi 1:

0 1
0 0

Diventa più chiaro se si rimuovono spazi e righe di separazione di byte:

0099    | +1
0100

Abbiamo previsto che potrebbe verificarsi un overflow e potrebbe essere necessaria memoria aggiuntiva. Gestire i numeri in questo modo non è veloce come con i numeri che si adattano in una sola parola e deve essere implementato nel software. L'aggiunta del supporto per numeri di parole a 32 bit a una CPU a 32 bit la rende effettivamente una CPU a 64 bit (ora può operare nativamente su numeri a 64 bit, giusto?).

Tutto ciò che ho descritto sopra si applica alla memoria binaria con byte a 8 bit e anche parole a 4 byte, funziona praticamente allo stesso modo:

00000000 00000000 00000000 00000000 11111111 11111111 11111111 11111111    | +1
00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000000

La conversione di tali numeri in sistema decimale è tuttavia complicata. (ma funziona abbastanza bene con esadecimali )


21
La tua risposta è piuttosto condiscendente. OP è chiaramente parlando del numero, non il testo: large as the number 1 trillion (1000000000000). Inoltre, stai quasi parlando dell'aritmetica di precisione arbitraria , ma non hai mai veramente menzionato nessuno dei termini per quello che stai dicendo ....
MirroredFate

12
"1 trilione" è anche una stringa
Elzo Valugi

3
@ElzoValugi Lo è. Ho dovuto trovare un modo per presentare il concetto di numero astratto, al contrario di stringa che rappresenta un numero. Credo che "1 trilione" sia un modo migliore e meno ambiguo per farlo (vedere la prova in risposta).
Gronostaj,

25
@MirroredFate Non sono d'accordo con 'sta chiaramente parlando del numero'. OP dice "visualizzato bene", che chiaramente sta parlando del testo "1000000000000" per me ...
Joe

4
@yannbane 'A' è un personaggio e non un numero. '?' è un personaggio e non un numero. '1' è un personaggio e non anche un numero. I personaggi sono solo simboli. Possono rappresentare cifre o numeri, ma sicuramente non sono numeri. '1' può rappresentare uno, dieci, centomila e così via, è solo un simbolo che rappresenta una cifra che può essere un numero o una sua parte. '10' (stringa di caratteri) può significare due o otto o dieci o sedici ecc. Ma quando dici di avere dieci mele, stai usando un numero dieci e tutti sanno cosa intendi. C'è un'enorme differenza tra personaggi e numeri.
Gronostaj,

40

Puoi anche scrivere "QUESTA DICHIARAZIONE È FALSO" senza che il tuo computer si arresti in modo anomalo :) @La risposta di Scott è perfetta per alcuni framework di calcolo, ma la tua domanda di "scrivere" un numero elevato implica che è solo un semplice testo, almeno fino a quando è interpretato.

Modifica: ora con meno sarcasmo informazioni più utili su diversi modi in cui un numero può essere memorizzato. Descriverò questi con maggiore astrazione, cioè in termini in cui un programmatore moderno potrebbe scrivere codice prima che venga tradotto in codice macchina per l'esecuzione.

I dati su un computer devono essere limitati a un certo tipo e una definizione del computer di tale tipo descrive quali operazioni possono essere eseguite su questi dati e come (cioè confrontare numeri, concatenare testo o XOR un valore booleano). Non puoi semplicemente aggiungere testo a un numero, proprio come non puoi moltiplicare un numero per testo, quindi alcuni di questi valori possono essere convertiti tra i tipi.

Cominciamo con numeri interi senza segno . In questi tipi di valore, tutti i bit vengono utilizzati per memorizzare informazioni sulle cifre; il tuo è un esempio di un intero senza segno a 32 bit in cui è possibile memorizzare qualsiasi valore da 0a 2^32-1. E sì, a seconda della lingua o dell'architettura della piattaforma utilizzata potresti avere numeri interi a 16 bit o numeri interi a 256 bit.

E se vuoi diventare negativo? Intuitivamente, numeri interi firmati è il nome del gioco. La convenzione è di assegnare tutti i valori da -2^(n-1)a 2^(n-1)-1- in questo modo evitiamo la confusione di dover affrontare due modi di scrivere +0e -0. Quindi un intero con segno a 32 bit conterrà un valore da -2147483648a 2147483647. Pulito, no?

Ok, abbiamo coperto numeri interi che sono numeri senza un componente decimale. Esprimere questi è più complicato: la parte non intera può essere sensibilmente solo da qualche parte tra 0e 1, quindi ogni bit in più usato per descriverlo aumenterebbe la sua precisione: 1/2, 1/4, 1/8 ... Il problema è che tu non possono esprimere con precisione un semplice decimale 0.1come una somma di frazioni che possono avere solo poteri di due nel loro denominatore! Non sarebbe molto più facile memorizzare il numero come intero, ma accetti invece di mettere il punto radix (decimale)? Questo si chiama numeri a virgola fissa , dove memorizziamo 1234100ma concordiamo una convenzione per leggerlo come 1234.100invece.

Un tipo relativamente più comune utilizzato per i calcoli è floating point. Il modo in cui funziona è davvero pulito, usa un bit per memorizzare il valore del segno, quindi alcuni per memorizzare esponente e significato. Esistono standard che definiscono tali allocazioni, ma per un float a 32 bit il numero massimo che potresti memorizzare è un travolgente

(2 - 2^-23) * 2^(2^7 - 1) ≈ 3.4 * 10^38

Questo, tuttavia, ha un costo di precisione. JavaScript disponibile nei browser utilizza float a 64 bit e non riesce ancora a fare le cose nel modo giusto. Basta copiarlo nella barra degli indirizzi e premere Invio. Avviso spoiler: il risultato non sarà 0.3.

javascript:alert(0.1+0.2);

Esistono altri tipi alternativi come Microsoft .NET 4.5 BigInteger, che teoricamente non ha limiti superiori o inferiori e deve essere calcolato in "batch"; ma forse le tecnologie più affascinanti sono quelle che comprendono la matematica, come il motore di Wolfram Mathematica, che può funzionare con precisione con valori astratti come l' infinito .


8
Puoi farlo in questa realtà. Prova a farlo nell'universo di Star Trek. Basta stare indietro prima, a causa di tutte le scintille e fumo.
Michael Petrotta,

Non è esattamente come funziona il punto fisso. In realtà è un sistema in cui i numeri vengono ridimensionati e distorti per produrre il punto decimale. Nel tuo esempio la scala è 1/1000, ma ci sono anche numeri a virgola fissa (specialmente in computer grafica) come questo: 0 = 0,0, 255 = 1,0 - la scala è 1/255.
Andon M. Coleman,

31

La chiave è capire come i computer codificano i numeri.

È vero, se un computer insiste sulla memorizzazione di numeri utilizzando una semplice rappresentazione binaria del numero utilizzando una sola parola (4 byte su un sistema a 32 bit), un computer a 32 bit può memorizzare solo numeri fino a 2 ^ 32. Ma ci sono molti altri modi per codificare i numeri a seconda di ciò che vuoi ottenere con loro.

Un esempio è come i computer memorizzano i numeri in virgola mobile. I computer possono usare un sacco di modi diversi per codificarli. Lo standard IEEE 754 definisce le regole per la codifica di numeri maggiori di 2 ^ 32. In modo grossolano, i computer possono implementarlo dividendo i 32 bit in parti diverse che rappresentano alcune cifre del numero e altri bit che rappresentano la dimensione del numero (cioè l'esponente, 10 ^ x). Ciò consente una gamma molto più ampiadi numeri in termini di dimensioni, ma compromette la precisione (che è OK per molti scopi). Ovviamente il computer può anche usare più di una parola per questa codifica aumentando la precisione della grandezza dei numeri codificati disponibili. La semplice versione decimale 32 dello standard IEEE consente numeri con circa 7 cifre decimali di precisione e numeri fino a circa 10 ^ 96 di magnitudine.

Ma ci sono molte altre opzioni se hai bisogno di maggiore precisione. Ovviamente puoi usare più parole nella tua codifica senza limiti (anche se con una penalità prestazionale per convertire dentro e fuori il formato codificato). Se vuoi esplorare un modo in cui questo può essere fatto, c'è un ottimo componente aggiuntivo open source per Excel che utilizza uno schema di codifica che consente il calcolo di centinaia di cifre di precisione. Il componente aggiuntivo si chiama Xnumbers ed è disponibile qui . Il codice è in Visual Basic che non è il più veloce possibile ma ha il vantaggio di essere facile da capire e modificare. È un ottimo modo per imparare come i computer ottengono la codifica di numeri più lunghi. E puoi giocare con i risultati in Excel senza dover installare strumenti di programmazione.


24

È tutto nella tua domanda.

Puoi scrivere qualsiasi numero che ti piace su carta. Prova a scrivere un trilione di punti su un foglio di carta bianco. È lento e inefficace. Ecco perché abbiamo un sistema a 10 cifre per rappresentare quei grandi numeri. Abbiamo anche nomi per grandi numeri come "milioni", "trilioni" e altro, quindi non puoi dirlo one one one one one one one one one one one...ad alta voce.

I processori a 32 bit sono progettati per funzionare in modo più rapido ed efficiente con blocchi di memoria lunghi esattamente 32 cifre binarie. Ma noi, gente, usiamo comunemente il sistema numerico a 10 cifre e i computer, essendo elettronici, usiamo il sistema a 2 cifre ( binario ). I numeri 32 e 64 sono solo potenze di 2. Quindi un milione e un trilione sono potenze di 10. È più facile per noi operare con questi numeri rispetto alle moltitudini di 65536, per esempio.

Dividiamo grandi numeri in cifre quando li scriviamo su carta. I computer suddividono i numeri in un numero maggiore di cifre. Possiamo scrivere qualsiasi numero ci piaccia, e così pure i computer se li progettiamo così.


15

32 bit e 64 bit si riferiscono agli indirizzi di memoria. La memoria del tuo computer è come una casella postale, ognuna ha un indirizzo diverso. La CPU (Central Processing Unit) utilizza quegli indirizzi per indirizzare le posizioni di memoria sulla RAM (Random Access Memory). Quando la CPU poteva gestire solo indirizzi a 16 bit, era possibile utilizzare solo 32 MB di RAM (che all'epoca sembrava enorme). Con 32 bit è andato a 4 + gb (che all'epoca sembrava enorme). Ora che abbiamo indirizzi a 64 bit, la RAM va in terabyte (che sembra enorme).
Tuttavia, il programma è in grado di allocare più blocchi di memoria per cose come la memorizzazione di numeri e testo, ciò dipende dal programma e non è correlato alla dimensione di ciascun indirizzo. Quindi un programma può dire alla CPU, userò 10 blocchi di indirizzi di archiviazione e quindi memorizzerò un numero molto grande, o una stringa di 10 lettere o altro.
Nota a margine: gli indirizzi di memoria sono indicati da "puntatori", quindi il valore a 32 e 64 bit indica la dimensione del puntatore utilizzato per accedere alla memoria.


2
Buona risposta, tranne per i dettagli: 16 bit di spazio degli indirizzi ti davano 64kb, non 32mb, e macchine come il 286 avevano indirizzi a 24 bit (per 16mb). Inoltre, con gli indirizzi a 64 bit, si va ben oltre i terabyte - più come i 16 exabyte - i terabyte si aggirano attorno al tipo di limiti imposti dalle schede madri / CPU della generazione attuale, non dalle dimensioni degli indirizzi.
Phil

4
32 bit si riferisce alla dimensione della parola macchina, non agli indirizzi di memoria. Come accennato da Phil, 286 era una CPU a 16 bit ma utilizzava 24 bit per indirizzare attraverso la segmentazione della memoria. Le CPU x86 sono a 32 bit, ma utilizzano l'indirizzamento a 36 bit. Vedi PAE .
Gronostaj,

@gronostaj bene x86 hanno indirizzamento a 32 bit da 386 a Pentium.
Ruslan,

Valuta perché questa è l'unica risposta CORRETTA qui - 32 bit si riferisce all'indirizzamento della memoria a 32 bit, non all'aritmetica a 32 bit.
user1207217

@ user1207217: ?? Quindi, secondo il tuo ragionamento, ad esempio Z80 o 8080 sono processori a 16 bit (a causa dell'indirizzamento della memoria a 16 bit e del bus di memoria)?
pabouk,

13

Perché la visualizzazione del numero viene effettuata utilizzando singoli caratteri, non numeri interi. Ogni cifra nel numero è rappresentata da un carattere letterale separato, il cui valore intero è definito dalla codifica utilizzata, ad esempio 'a'è rappresentato con valore ASCII 97, mentre '1'è rappresentato con 49. Controlla la tabella ASCII qui .
Per visualizzare sia 'a' che '1' è lo stesso. Sono letterali di caratteri, non numeri interi. A ogni carattere letterale è consentito avere un valore massimo di 255 nella piattaforma a 32 bit che memorizza il valore in dimensioni di 8 bit o 1 byte (dipende dalla piattaforma, tuttavia 8 bit è la dimensione dei caratteri più comune), quindi possono essere raggruppati e possono essere visualizzato. Quanti caratteri separati possono visualizzare dipendono dalla RAM che hai. Se hai solo 1 byte di RAM, puoi visualizzare solo un carattere, se hai 1 GB di RAM, puoi visualizzare ben 1024 * 1024 * 1024 caratteri (Troppo pigro per fare i conti).

Questa limitazione si applica tuttavia ai calcoli, tuttavia suppongo che tu sia interessato allo standard IPV4. Anche se non è interamente correlato a quello dei computerbit-size, ha in qualche modo influenzato gli standard. Quando lo standard IPV4 è stato creato, hanno archiviato i valori ip in numeri interi a 32 bit. Ora una volta hai dato la dimensione ed è diventata standard. Tutto ciò che sappiamo su Internet dipendeva da questo, e quindi abbiamo finito gli indirizzi IP da assegnare. Quindi, se lo standard IP è stato modificato a 64 bit, tutto smetterà di funzionare, incluso il router (presumo che sia corretto) e altri dispositivi di rete. Quindi deve essere creato un nuovo standard, che ha appena scambiato il numero intero a 32 bit con uno a 128 bit. E adattato resto dello standard. Il produttore dell'hardware deve solo dichiarare di supportare questo nuovo standard e diventerà virale. Anche se non è così semplice, ma immagino che tu abbia capito il punto qui.

Disclaimer: la maggior parte dei punti menzionati qui sono fedeli alla mia ipotesi. Potrei aver perso punti importanti qui per renderlo più semplice. Non sono bravo con i numeri, quindi devo aver perso alcune cifre, ma il mio punto qui è rispondere alla risposta dell'OP sul perché non si bloccherà il PC.


2
Non ho effettuato il downgrade, ma ci sono una serie di problemi con la tua risposta. 1è 0x31 in ASCII, non 0x1. 1 GB = 1024 ^ 3 B. Il batuffolo IPv4 inventato prima dell'introduzione delle CPU a 32 bit, quindi dire che gli indirizzi erano memorizzati in numeri interi a 32 bit è in conflitto con la domanda di OP. E infine IPv6 utilizza indirizzi a 128 bit, non a 64 bit.
Gronostaj,

13

Nei processori ci sono "parole". Ci sono parole diverse. Quando la gente dice "processore a 32 bit", significa principalmente "larghezza del bus di memoria". Questa parola è composta da diversi "campi", che si riferiscono a sottosistemi di computer corrispondenti alla trasmissione (24 bit) e al controllo (altri bit). Posso sbagliarmi sui numeri esatti, assicurarti attraverso i manuali.

L'aspetto completamente diverso è il calcolo. I set di istruzioni SSE e MMX possono memorizzare numeri interi lunghi. La lunghezza massima senza perdita di produttività dipende dalla versione attuale di SSE, ma è sempre un multiplo di 64 bit.

Gli attuali processori Opteron sono in grado di gestire numeri di 256 bit (non sono sicuro dell'intero, ma il float è sicuro).

Riepilogo : (1) la larghezza del bus non è collegata direttamente alla larghezza di calcolo, (2) anche parole diverse (parola di memoria, parola di registro, parola di bus ecc.) Non sono collegate tra loro, altrimenti hanno un divisore comune di circa 8 o 16 o 24. Molti processori hanno persino usato una parola a 6 bit (ma la sua storia).


Non è vero, il processore Pentium originale aveva un bus dati a 64 bit per un'elevata larghezza di banda della memoria, anche se era un processore a 32 bit. L'8088 era un processore a 16 bit con un bus dati a 8 bit.
doug65536,

10

Lo scopo di un dispositivo informatico, in generale, è accettare, elaborare, archiviare ed emettere dati. L'hardware sottostante è semplicemente una macchina che aiuta a svolgere queste quattro funzioni. Non può fare nessuno di quelli senza software.

Il software è il codice che indica alla macchina come accettare i dati, come elaborarli, come archiviarli e come fornirli ad altri.

L'hardware sottostante avrà sempre dei limiti. Nel caso di una macchina a 32 bit, la maggior parte dei registri che elaborano i dati ha una larghezza di soli 32 bit. Ciò non significa, tuttavia, che la macchina non sia in grado di gestire numeri oltre 2 ^ 32, significa che se si desidera gestire numeri più grandi, potrebbe essere necessario più di un ciclo per accettarlo, elaborarlo, archiviarlo o emettilo.

Il software dice alla macchina come gestire i numeri. Se il software è progettato per gestire numeri di grandi dimensioni, invia una serie di istruzioni alla CPU che gli dicono come gestire i numeri più grandi. Ad esempio, il tuo numero può essere rappresentato da due registri a 32 bit. Se si desidera aggiungere 1.234 al proprio numero, il software direbbe alla CPU di aggiungere prima 1.234 al registro inferiore, quindi controllare il bit di overflow per vedere se quell'aggiunta ha comportato un numero troppo grande per il registro inferiore. In tal caso, aggiunge 1 al registro superiore.

Allo stesso modo in cui agli scolari elementari viene insegnato di aggiungere con carry, si può dire alla CPU di gestire numeri più grandi di quelli che possono contenere in un unico registro. Questo è vero per la maggior parte delle operazioni matematiche generiche, per numeri di qualsiasi dimensione pratica.


10

La differenza sta nel modo in cui archiviamo i dati nei computer.

È corretto che per una macchina teorica a 8 bit, siamo in grado di memorizzare solo 2 ^ 8 valori in un singolo registro del processore o indirizzo di memoria. (Tieni presente che questo varia da "macchina" a "macchina" in base al processore utilizzato, all'architettura della memoria, ecc. Ma per ora, restiamo con un'ipotetica macchina "stereotipata".)

Per una macchina teorica a 16 bit, il valore massimo in una posizione di registro / memoria sarebbe 2 ^ 16, per una macchina a 32 bit, 2 ^ 32, ecc.

Nel corso degli anni, i programmatori hanno ideato ogni sorta di chicane per memorizzare e gestire numeri maggiori di quelli che possono essere memorizzati in un singolo registro del processore o indirizzo di memoria. Esistono molti metodi, ma implicano tutti l'uso di più di un indirizzo di registro / memoria per memorizzare valori maggiori della loro larghezza "nativa" di posizione di registro / memoria.

Tutti questi metodi sono utili in quanto la macchina può memorizzare / elaborare valori maggiori della loro capacità nativa. Il rovescio della medaglia è che quasi tutti gli approcci richiedono più istruzioni / letture / ecc. per gestire questi numeri. Per il grande numero occasionale, questo non è un problema. Quando si ha a che fare con molti numeri grandi (in particolare indirizzi di memoria di grandi dimensioni) il sovraccarico coinvolto rallenta le cose.

Da qui il desiderio generale di rendere i registri, le posizioni di memoria e l'hardware dell'indirizzo di memoria "più ampi" e più ampi al fine di gestire grandi numeri "nativamente" in modo che tali numeri possano essere gestiti con il numero minimo di operazioni.

Poiché la dimensione del numero è infinita, il registro del processore / dimensione della memoria / indirizzamento è sempre un equilibrio tra la dimensione del numero nativo e i costi associati all'implementazione di larghezze sempre più grandi.


8

I computer a 32 bit possono memorizzare solo numeri fino a 2 ^ 32 in una singola parola macchina, ma ciò non significa che non possano gestire entità di dati più grandi.

Il significato di un computer a 32 bit è generalmente che il bus dati e il bus indirizzo sono larghi 32 bit, il che significa che il computer può gestire 4 GB di spazio di indirizzi di memoria contemporaneamente e inviare quattro byte di dati alla volta sul bus dati .

Ciò tuttavia non impedisce al computer di gestire più dati, ma deve solo dividere i dati in blocchi di quattro byte quando viene inviato sul bus dati.

Il normale processore Intel a 32 bit è in grado di gestire internamente numeri a 128 bit, consentendo di gestire numeri come 10000000000000000000000000000000000000000 senza alcun problema.

Puoi gestire numeri molto più grandi di quelli di un computer, ma poi i calcoli devono essere eseguiti da software, la CPU non ha istruzioni per gestire numeri maggiori di 128 bit. (Può gestire numeri molto più grandi sotto forma di numeri in virgola mobile, ma poi hai solo 15 cifre di precisione.)


6

Basta aggiungere una nota a molte altre risposte, perché questo è un fatto piuttosto importante in questa domanda che è stata persa.

"32 bit" si riferisce alla larghezza dell'indirizzo di memoria. Non ha nulla a che fare con la dimensione del registro. Molte CPU a 32 bit hanno probabilmente registri a 64 o addirittura a 128 bit. In particolare riferendosi alla linea di prodotti x86, le recenti CPU consumer, che sono tutte a 64 bit, possiedono registri fino a 256 bit per scopi speciali.

Questa differenza tra la larghezza del registro e la larghezza dell'indirizzo esiste dai tempi antichi, quando avevamo registri a 4 bit e indirizzi a 8 bit, o viceversa.

È semplice vedere che la memorizzazione di un numero elevato non è un problema, indipendentemente dalle dimensioni del registro, come spiegato in altre risposte.

Il motivo per cui i registri, di qualsiasi dimensione essi possano essere, possono anche calcolare anche con numeri più grandi, è che calcoli troppo grandi possono essere suddivisi in molti più piccoli che si adattano ai registri (è solo un po 'più complicato in realtà).


Questo non è proprio vero; ciò a cui si riferisce 64 bit è incoerente, ma i sistemi con larghezza di registro di 64 bit vengono spesso chiamati 64 bit. Wikipedia afferma che "un'architettura di computer a 64 bit ha generalmente numeri interi e di indirizzamento di 64 bit di larghezza". Sì, la moderna linea di prodotti x86 (o AMD-64) ha enormi registri per scopi speciali, ma hanno registri principali a 64 bit e possono accedere a 48-52 bit di memoria; i vecchi sistemi x86 hanno registri principali a 32 bit e accedono a 24-36 bit di memoria, e l'8086 era chiamato chip a 16 bit, aveva registri larghi a 16 bit e accedeva a 20 bit di memoria.
prosfilaes,

@prosfilaes Queste sono molte informazioni preziose, mi riferivo a quelle (non sono riuscito a ricordare i dettagli così come hai fatto tu). Sentiti libero di modificarlo nella risposta.
mafu,

6

Le risposte già fornite sono in realtà piuttosto buone, ma tendono ad affrontare il problema da diverse parti e quindi presentano un quadro incompleto. Sono anche un po 'troppo tecnici, secondo me.

Quindi, solo per chiarire qualcosa che è accennato ma non esplicitamente espresso in nessuna delle altre risposte, e che penso sia il nocciolo della questione:

Stai mescolando diversi concetti nella tua domanda e uno di essi ("32 bit") può effettivamente riferirsi a una varietà di cose diverse (e risposte diverse hanno assunto interpretazioni diverse). Tutti questi concetti hanno qualcosa a che fare con il numero di bit (1 e 0) utilizzati (o disponibili) in vari contesti informatici (ciò che intendo con questo si spera sarà chiarito dagli esempi seguenti), ma i concetti non sarebbero altrimenti correlati .

esplicitamente:

  • "IPv4 / 6" si riferisce al protocollo Internet , un insieme di regole che definiscono le modalità di impacchettamento e interpretazione delle informazioni su Internet. La distinzione principale (o almeno la più nota) tra IPv4 e IPv6 è che lo spazio degli indirizzi (ovvero l'insieme di indirizzi che può essere utilizzato per distinguere tra diverse posizioni sulla rete) è maggiore in IPv6. Ciò ha a che fare con quanti bit in ciascun pacchetto di dati inviati attraverso la rete sono allocati (cioè messi da parte allo scopo di) identificare il mittente del pacchetto e il destinatario previsto.
    • Analogia non informatica: ogni pacchetto è come una lettera inviata via posta ordinaria e lo spazio degli indirizzi è come la quantità di caratteri che "ti è permesso" usare quando scrivi l'indirizzo e l'indirizzo di ritorno sulla busta.
    • Finora non lo vedo menzionato in nessuna delle altre risposte.
  • Le "parole" di memoria del computer (32-bit e 64-bit) possono essere generalmente considerate il più piccolo pezzo di dati che un computer utilizza o "pensa". Questi bit di dati si uniscono per formare altri bit di dati , ad esempio blocchi di testo o numeri interi più grandi.
  • I puntatori a 32 bit possono o meno essere parole, ma sono comunque trattati atomicamente (cioè come singole unità che non possono essere scomposte in componenti più piccoli). I puntatori sono il modo di livello più basso in cui un computer può registrare la posizione in memoria di alcuni blocchi arbitrari di dati. Si noti che la dimensione del puntatore utilizzata dal computer (o, in realtà, dal sistema operativo) limita l'intervallo di memoria a cui è possibile accedere da un singolo puntatore, poiché ci sono solo quante possibili posizioni di memoria che un puntatore può "puntare" a in quanto vi sono possibili valori per il puntatore stesso. Questo è analogo al modo in cui IPv4 limita la gamma di possibili indirizzi Internet, ma non lo falimitare la quantità di dati che possono essere presenti, ad esempio, in una determinata pagina Web. Tuttavia, la dimensione del puntatore non limita la dimensione dei dati stessi a cui può puntare il puntatore. (Per un esempio di uno schema per consentire alle dimensioni dei dati di superare l'intervallo del puntatore, controlla la struttura del puntatore inode di Linux . Nota che questo è un uso leggermente diverso della parola "puntatore" rispetto a quello tipico, poiché il puntatore di solito si riferisce a un puntatore a memoria ad accesso casuale, non spazio sul disco rigido.)
    • Analogia non informatica: hmmmm .... questo è un po 'complicato. Forse il sistema decimale Dewey per l'indicizzazione dei materiali della biblioteca è un po 'simile? O qualsiasi sistema di indicizzazione, davvero.
    • Vedi la risposta di SiteNook .
    • Si prega di notare che la mia spiegazione dei puntatori sopra elude alcuni dettagli sottili e probabilmente non è del tutto corretta. Tuttavia, nei linguaggi di programmazione in cui i programmatori lavorano direttamente con i puntatori, la modalità mentale che ho disegnato è di solito sufficiente per scopi pratici.
  • I numeri che un computer è "in grado di visualizzare" non sono (per scopi pratici) limitati dall'hardware o dal sistema operativo del computer; sono trattati come qualsiasi altro testo.

Si noti che questo non è destinato ad essere un elenco completo di interpretazioni per la frase "32 bit".

Credito extra: per vedere davvero la netta distinzione filosofica tra numeri e pezzi primitivi della memoria del computer, leggi qualcosa sulle macchine di Turing .


Penso che il riferimento a IPv4 sia stato quello di sottolineare che il numero di indirizzi IPv4 è effettivamente limitato alla lunghezza di un intero con segno a 32 bit, mentre IPv6 utilizza 128 bit e può quindi avere molti ordini di grandezza più indirizzi.
Clonkex,

@Clonkex Forse, anche se non è certo che la domanda sia formulata.
Kyle Strand,

5

Se si scrive 1000000000000 ad esempio nella calcolatrice, il computer lo calcolerà come un numero di tipo Reale con punto decimale . Il limite per 32 bit che hai citato tocca più tutti i numeri di tipo Integer senza punto decimale. Tipi di dati diversi utilizzano metodi diversi per ottenere bit / byte.

Numeri di tipo intero : questa tabella può aiutarti a capire il punto ( http://msdn.microsoft.com/en-us/library/296az74e.aspx ). Questo tocca i limiti per C ++. Ad esempio il numero di tipo Int64 ha limiti da -9223372036854775808 a 9223372036854775807.

Numeri di tipo reale : i numeri di tipo reale contengono valore con virgola mobile ed esponente e puoi inserire numeri molto più grandi, ma con precisione / precisione limitate. ( http://msdn.microsoft.com/en-us/library/6bs3y5ya.aspx ) Ad esempio LDBL (doppio grande) in C ++ ha il massimo esponente 308, quindi possibilmente puoi inserire o avere come risultato un numero 9.999 x 10^308, significa che lo farai hanno teoricamente 308 (+1) cifre di 9ma solo 15 cifre più importanti verranno utilizzate per rappresentarlo, il resto andrà perso, a causa della precisione limitata.

Inoltre, esistono diversi linguaggi di programmazione e potrebbero avere implementazioni diverse dei limiti numerici. Quindi puoi immaginare che le applicazioni specializzate possano gestire numeri molto più grandi (e / o più esatti / precisi) rispetto al C ++.


Questa "risposta" non è corretta: i calcolatori usano la rappresentazione del numero BCD per evitare errori di troncamento. Il decimale IE 0,1 non può essere rappresentato con precisione come un numero binario a lunghezza finita.
segatura,

5

Nel caso in cui desideri un esempio pratico di quanti programmi su un tipico sistema Linux gestiscono elaborazione e output di grandi numeri:

libgmp- La libreria aritmetica a precisione multipla GNU è la libreria più utilizzata a tale scopo sui sistemi Linux. Un semplice esempio di moltiplicazione di 2 ^ 80 per 1000:

#include <gmp.h>

// Each large integer uses the mpz_t type provided by libgmp
mpz_t a_large_number;
mpz_t base;
mpz_t result;

// Initalize each variable
mpz_init(a_large_number);
mpz_init(base);
mpz_init(result);

// Assign the number 2 to the variable |base|
mpz_set_ui(base, 2);

// Raise base^80 (2^80), store the result in |a_large_number|
mpz_pow_ui(a_large_number, base, 80);

// Multiply |a_large_number| by 1000, store the result in |result|
mpz_mul_ui(result, a_large_number, 1000);

// Finally, output the result in decimal and hex notation
gmp_printf("decimal: %Zd, hex: %ZX\n", result, result);

Quindi, fondamentalmente, è lo stesso che usare i normali operatori + - * /, solo con una libreria per suddividere i numeri e memorizzarli internamente come numeri di dimensioni macchina multiple (cioè 32 bit). Esistono anche funzioni di tipo scanf () per gestire la conversione dell'input di testo in tipi interi.

La struttura di mpz_tè esattamente come l'esempio di Scott Chamberlain di contare fino a 6 usando due mani. È fondamentalmente una matrice di mp_limb_ttipi di dimensioni di una parola macchina e quando un numero è troppo grande per adattarsi a una parola macchina, GMP usa il multiplo mp_limb_tper memorizzare le parti alte / basse del numero.


5

Nella tua mente conosci solo 10 cifre diverse. Da 0 a 9. Internamente nel tuo cervello, questo è sicuramente codificato in modo diverso rispetto a un computer.

Un computer utilizza i bit per codificare i numeri, ma ciò non è importante. Questo è solo il modo in cui gli ingegneri hanno scelto di codificare le cose, ma dovresti ignorarlo. Puoi pensarlo come un computer a 32 bit con una rappresentazione unica di oltre 4 miliardi di valori diversi, mentre noi umani abbiamo una rappresentazione unica per 10 valori diversi.

Ogni volta che dobbiamo comprendere un numero maggiore, utilizziamo un sistema. Il numero più a sinistra è il più importante. È 10 volte più importante del prossimo.

Un computer in grado di distinguere tra quattro miliardi di valori diversi, allo stesso modo dovrà rendere il valore più a sinistra, in una serie di valori, quattro miliardi di volte più importante del valore successivo in quella serie. In realtà a un computer non importa affatto. Non assegna "importanza" ai numeri. I programmatori devono creare un codice speciale per occuparsene.

Ogni volta che un valore diventa maggiore del numero di simboli univoci, 9 nella mente di un uomo, ne aggiungi uno al numero a sinistra.

3+3=6

In questo caso, il numero si adatta ancora all'interno di un singolo "slot"

5+5=10. This situation is called an overflow.

Quindi gli umani affrontano sempre il problema di non avere abbastanza simboli unici. A meno che il computer non abbia un sistema per gestirlo, scriverebbe semplicemente 0, dimenticando che c'era un numero in più. Fortunatamente, i computer hanno un "flag di overflow" che viene generato in questo caso.

987+321 is more difficult.

Potresti aver imparato un metodo a scuola. Un algoritmo L'algoritmo è abbastanza semplice. Inizia aggiungendo i due simboli più a sinistra.

7+1=8, we now have ...8 as the result so far

Quindi passa allo slot successivo ed esegui la stessa aggiunta.

8+2=10, the overflow flag is raised. We now have ...08, plus overflow.

Dato che abbiamo avuto un overflow, significa che dobbiamo aggiungere 1 al numero successivo.

9+3=12, and then we add one due to overflow. ...308, and we had another overflow.

Non ci sono più numeri da aggiungere, quindi creiamo semplicemente uno slot e inseriamo 1 perché il flag di overflow è stato sollevato.

1308

Un computer fa esattamente allo stesso modo, tranne per il fatto che ha 2 ^ 32 o anche meglio 2 ^ 64 simboli diversi, anziché solo 10 come gli umani.

A livello hardware, il computer funziona su singoli bit usando esattamente lo stesso metodo. Fortunatamente, ciò viene sottratto ai programmatori. I bit sono solo due cifre, perché è facile da rappresentare in una linea elettrica. O la luce è accesa o è spenta.

Infine, un computer potrebbe visualizzare qualsiasi numero come una semplice sequenza di caratteri. Ecco a cosa servono i computer. L'algoritmo per la conversione tra una sequenza di caratteri e una rappresentazione interna è piuttosto complesso.


Nella mia mente ne conosco 36, ma di solito ne uso solo 16.
Kyle Strand

"Un computer utilizza i bit per codificare i numeri, ma questo non è importante." Nel contesto in cui l'utente chiede circa 32 bit di parole e come vengono utilizzati per memorizzare numeri superiori a 2 ^ 32-1 è molto importante.
HörmannHH,

Non è importante come codifichi i numeri nella memoria del tuo cervello. Hai un numero finito di rappresentazioni; la maggior parte ha imparato 10 simboli diversi. All'interno del tuo cervello, questo è probabilmente rappresentato sotto forma di migliaia di neuroni e sinapsi. In un computer è rappresentato sotto forma di elettricità o assenza di elettricità su una linea elettrica. Dal punto di vista della programmazione - o quando apprendi la matematica, non è affatto importante, tranne nel raro caso in cui stai programmando direttamente per un set specifico di CPU. Chiede circa 32 bit contro 64 bit, non singoli bit.
frodeborli,

3

Perché non stai visualizzando un numero (per quanto riguarda il computer), ma una stringa o una sequenza di cifre. Certo, alcune app (come la calcolatrice, immagino), che si occupano di numeri, possono gestire un tale numero, immagino. Non so quali trucchi usano ... Sono sicuro che alcune delle risposte più elaborate lo coprono.


0

La maggior parte del contenuto di questa risposta originariamente proveniva da questa risposta (scritta prima che l'altra domanda fosse contrassegnata come duplicata). Quindi discuto l'utilizzo di valori a 8 bit (anche se questa domanda ha richiesto valori a 32 bit), ma va bene perché i valori a 8 bit sono più semplici da comprendere concettualmente e gli stessi concetti si applicano a valori più grandi come l'aritmetica a 32 bit.

Quando aggiungi due numeri a 8 bit, il numero più grande che puoi ottenere (0xFF + 0xFF = 1FE). Infatti, se moltiplichi due numeri che sono 8 bit, il numero più grande che puoi ottenere (0xFF * 0xFF = 0xFE01) è ancora 16 bit, due volte di 8 bit.

Ora, potresti supporre che un processore x-bit possa tenere traccia solo di x-bit. (Ad esempio, un processore a 8 bit può tenere traccia solo di 8 bit.) Non è esatto. Il processore a 8 bit riceve i dati in blocchi di 8 bit. (Questi "blocchi" in genere hanno un termine formale: una "parola". Su un processore a 8 bit, vengono utilizzate parole a 8 bit. Su un processore a 64 bit, è possibile utilizzare parole a 64 bit.)

Quindi, quando si danno al computer 3 byte:
Byte # 1: l'istruzione MUL
Byte # 2: i byte di ordine superiore (ad es. 0xA5)
Byte # 3: i byte di ordine inferiore (ad es. 0xCB)
Il computer può generare un risultato che è più di 8 bit. La CPU può generare risultati come questo:
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
aka:
0x4082xxxxD7
Ora, lasciami interpretare che per te:
0x significa solo che le seguenti cifre sono esadecimali.
Discuterò i "40" in modo più dettagliato per un momento.
82 fa parte del registro "A", che è una serie di 8 bit.
xx e xx fanno parte di altri due registri, denominati registro "B" e registro "C". Il motivo per cui non ho riempito quei bit con zero o uno è che un'istruzione "ADD" (inviata alla CPU) può far sì che quei bit rimangano invariati dall'istruzione (mentre la maggior parte degli altri bit che uso in questo esempio può viene modificato, ad eccezione di alcuni dei bit di flag).
D7 si adatterebbe in più bit, chiamato registro "D".
Un registro è solo un pezzo di memoria. I registri sono integrati nelle CPU, quindi la CPU può accedere ai registri senza la necessità di interagire con la memoria su una chiavetta RAM.

Quindi il risultato matematico di 0xA5 volte 0xCB è 0x82D7.

Ora, perché i bit sono stati divisi nei registri A e D anziché nei registri A e B o nei registri C e D? Bene, ancora una volta, questo è uno scenario di esempio che sto usando, pensato per essere piuttosto simile nel concetto a un vero linguaggio Assembly (Intel x86 a 16 bit, utilizzato da Intel 8080 e 8088 e molte CPU più recenti). Potrebbero esserci alcune regole comuni, come il registro "C" in genere utilizzato come indice per le operazioni di conteggio (tipico per i loop) e il registro "B" utilizzato per tenere traccia degli offset che aiutano a specificare le posizioni di memoria. Pertanto, "A" e "D" possono essere più comuni per alcune delle comuni funzioni aritmetiche.

Ogni istruzione CPU dovrebbe avere della documentazione, usata dalle persone che programmano in Assembly. Tale documentazione dovrebbe specificare quali registri vengono utilizzati da ciascuna istruzione. (Quindi la scelta su quali registri usare è spesso specificata dai progettisti della CPU, non dai programmatori del linguaggio Assembly. Anche se può esserci una certa flessibilità.)

Ora, tornando a "40" nell'esempio sopra: si tratta di una serie di bit, spesso chiamati "flags register". Ogni bit nel registro flag ha un nome. Ad esempio, esiste un bit di "overflow" che la CPU può impostare se il risultato è maggiore dello spazio che può memorizzare un byte dei risultati. (Il bit di "overflow" può essere spesso indicato con il nome abbreviato di "OF". Questo è un maiuscolo o non uno zero.) Il software può verificare il valore di questo flag e notare il "problema". Lavorare con questo bit è spesso gestito in modo invisibile da linguaggi di livello superiore, quindi i programmatori principianti spesso non imparano come interagire con i flag della CPU. Tuttavia, i programmatori di Assembly possono accedere ad alcuni di questi flag in modo molto simile ad altre variabili.

Ad esempio, potresti avere più istruzioni ADD. Un'istruzione ADD potrebbe memorizzare 16 bit di risultati nel registro A e nel registro D, mentre un'altra istruzione potrebbe semplicemente memorizzare gli 8 bit bassi nel registro A, ignorare il registro D e specificare il bit di overflow. Quindi, in seguito (dopo aver memorizzato i risultati del registro A nella RAM principale), è possibile utilizzare un'altra istruzione ADD che memorizza solo gli 8 bit alti in un registro (possibilmente il registro A). Può essere necessario utilizzare un flag di overflow dipende da quale istruzione di moltiplicazione usi.

(C'è anche comunemente un flag "underflow", nel caso in cui si sottragga troppo per adattarsi al risultato desiderato.)

Solo per mostrarti quanto sono complicate le cose:
l'Intel 4004 era una CPU a 4 bit
L'Intel 8008 era una CPU a 8 bit. Aveva registri a 8 bit denominati A, B, C e D.
L'Intel 8086 era una CPU a 16 bit. Aveva registri a 16 bit denominati AX, BX, CX e DX.
L'Intel 80386 era una CPU a 32 bit. Aveva registri a 32 bit denominati EAX, EBX, ECX ed EDX.
Le CPU Intel x64 hanno registri a 64 bit denominati RAX, RBX, RCX e RDX. I chip x64 possono eseguire codice a 16 bit (in alcune modalità operative) e possono interpretare istruzioni a 16 bit. Nel fare ciò, i bit che compongono il registro AX sono la metà dei bit che compongono il registro EAX, che sono la metà dei bit che compongono il registro RAX. Quindi ogni volta che modifichi il valore di AX, stai anche cambiando EAX e RAX, perché quei bit usati da AX fanno parte dei bit usati da RAX. (Se si modifica EAX di un valore multiplo di 65.536, i 16 bit bassi rimangono invariati, quindi AX non cambierebbe. Se si modifica EAX di un valore che non è un multiplo di 65.536, ciò influirebbe anche su AX .)

Ci sono più bandiere e registri oltre a quelli che ho citato. Ho semplicemente scelto alcuni di quelli comunemente usati per fornire un semplice esempio concettuale.

Ora, se si utilizza una CPU a 8 bit, quando si scrive in memoria, è possibile riscontrare alcune limitazioni sulla possibilità di fare riferimento a un indirizzo di 8 bit, non a un indirizzo di 4 bit o 16 bit. I dettagli varieranno in base alla CPU, ma se si hanno tali restrizioni, è possibile che la CPU abbia a che fare con parole a 8 bit, motivo per cui la CPU viene comunemente definita "CPU a 8 bit".


Sento che pezzi della mia risposta ripetono alcune delle altre risposte a questa domanda. Tuttavia, questo non è stato notato quando ho scritto il contenuto per la prima volta da quando l'ho scritto per un'altra domanda. Inoltre, mentre apprezzo la risposta dell'Animismo che include un po 'di codice nel linguaggio C, ho ritenuto che il mio contenuto fornisse alcuni dettagli su come funziona Assembly, che è più vicino alle azioni / alla progettazione effettive della CPU. Quindi la mia risposta non sta cercando di essere la risposta superiore che è "migliore di" tutti gli altri, ma solo supplementare; aggiungendo un'altra prospettiva con alcune informazioni aggiuntive
TOOGAM il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.