In che modo il computer determina se un numero è più piccolo o più grande di un altro?


34

Potrebbe sembrare una domanda stupida ma sono davvero curioso di sapere come un computer sa che 1<2 ? Inoltre, come fa un computer a sapere che l'ordine dei numeri interi è e l'alfabeto è A, B, C, D, ...? È archiviato da qualche parte nell'hardware o il sistema operativo fornisce questo tipo di informazioni?1,2,3,4,5,


1
Affinché a questa domanda possa essere data una risposta soddisfacente, dovremmo sapere quanto Ricky Stam sa dell'architettura del computer. Dalla domanda sembra molto poco, quindi nessuna delle fantasiose risposte di seguito sarà comprensibile per lui.
Andrej Bauer,

@AndrejBauer: In realtà, non ha effettuato l'accesso da quando ha posto la domanda. Forse ora sa tutto ciò di cui ha bisogno.
Dave Clarke,

Risposte:


31

Innanzitutto i tuoi numeri interi vengono convertiti in numeri binari. Ad esempio, l'intero 2 viene convertito in 0010.

La CPU utilizza un comparatore digitale :

Un comparatore digitale o un comparatore di grandezza è un dispositivo elettronico hardware che accetta due numeri come input in forma binaria e determina se un numero è maggiore o minore o uguale all'altro numero.

I comparatori vengono utilizzati nelle unità di elaborazione centrale (CPU) e nei microcontrollori.

Fonte: https://en.wikipedia.org/wiki/Digital_comparator

Nell'hardware del comparatore vengono utilizzate alcune porte (AND, OR, NAND, NOR, XOR, ecc.). Queste porte accettano input binari e danno risultati in binario. L'output può essere visto da una tabella di verità.

Inputs           Outputs
A   B     A>B    A=B    A<B
0   0     0       1      0
0   1     0       0      1
1   0     1       0      0
1   1     0       1      0

Qui 0e 1sono le tensioni elettroniche per il cancello.
1- Rappresenta una tensione di soglia che indica una tensione positiva.
0- Rappresenta la tensione inferiore alla soglia.

Ad esempio, supponiamo che un comparatore funzioni a 5 volt (è da considerare per una spiegazione), quindi: Una
tensione superiore a 3 volt può essere considerata come binary-1.
La tensione inferiore a 3 volt è considerata comebinary-0

Se un gate riceve un input come 3,5 volt e un altro input come 2 volt, considera come, prende un input come binario 1 e un altro input come binario 0.

Queste sequenze di 1 e 0 vengono fornite molto rapidamente attraverso il circuito di commutazione.

Il funzionamento di un comparatore digitale a due bit può essere espresso come una tabella di verità:

 Inputs                            Outputs
   A1   A0  B1  B0  A>B    A=B   A<B        
    0   0   0   0    0      1     0
    0   0   0   1    1      0     0
    0   0   1   0    1      0     0
    0   0   1   1    1      0     0
    0   1   0   0    0      0     1
    0   1   0   1    0      1     0
    0   1   1   0    1      0     0
    0   1   1   1    1      0     0
    1   0   0   0    0      0     1
    1   0   0   1    0      0     1
    1   0   1   0    0      1     0
    1   0   1   1    1      0     0
    1   1   0   0    0      0     1
    1   1   0   1    0      0     1
    1   1   1   0    0      0     1
    1   1   1   1    0      1     0

Per citare da Wikipedia :

Esempi: considerare due numeri binari A e B a 4 bit tali che
inserisci qui la descrizione dell'immagine
inserisci qui la descrizione dell'immagine
qui ogni pedice rappresenta una delle cifre nei numeri.

Uguaglianza

I numeri binari A e B saranno uguali se tutte le coppie di cifre significative di entrambi i numeri sono uguali, cioè
inserisci qui la descrizione dell'immagine. inserisci qui la descrizione dell'immagine. inserisci qui la descrizione dell'immagine. inserisci qui la descrizione dell'immagine

Poiché i numeri sono binari, le cifre sono 0 o 1 e la funzione booleana per l'uguaglianza di due cifre qualsiasi inserisci qui la descrizione dell'immaginee> inserisci qui la descrizione dell'immaginepuò essere espressa come
inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine è 1 solo se inserisci qui la descrizione dell'immaginee inserisci qui la descrizione dell'immagine sono uguali.

Per l'uguaglianza di A e B, tutte le inserisci qui la descrizione dell'immaginevariabili (per i = 0,1,2,3) devono essere 1. Quindi la condizione di qualità di A e B può essere implementata usando l'operazione AND come
inserisci qui la descrizione dell'immagine
La variabile binaria (A = B) è 1 solo se tutte le coppie di cifre dei due numeri sono uguali.

Disuguaglianza

Al fine di determinare manualmente il maggiore di due numeri binari, controlliamo le magnitudini relative di coppie di cifre significative, a partire dal bit più significativo, procedendo gradualmente verso bit significativi inferiori fino a trovare una disuguaglianza. Quando viene rilevata una disuguaglianza, se il bit corrispondente di A è 1 e quello di B è 0, concludiamo che A> B. Questo confronto sequenziale può essere espresso logicamente come:

inserisci qui la descrizione dell'immagine


2
Whoa, cosa sta succedendo qui?
Gilles 'SO- smetti di essere malvagio' il

1
"Per prima cosa i tuoi numeri interi vengono convertiti in numeri binari" ... sbagliato, ci sono solo numeri binari nella memoria al primo posto, tutti i suoi 1 e 0 a livello di macchina, quindi non c'è una "conversione", 2 è rappresentato come 10 dall'inizio alla fine ..
Dr.Haimovitz

Quando si copia materiale da altre fonti, è necessario fornire l'attribuzione corretta per le proprie fonti. Vedi qui e qui .
DW

La tabella del comparatore digitale a due bit non è corretta. ijesi.org/papers/Vol(2)1%20(version%202)/C211324.pdf quando A1, A0 sono entrambi zero ma B0 e B1 sono 0, 1 A> B sarà 0, ad esempio.
user1455116

14

Non solo "conosce", controlla ogni volta. Fondamentalmente, fa la stessa cosa che faresti: per confrontare, controlla (da sinistra) quale numero ha la prima cifra che è più grande di quella corrispondente nell'altro numero. Ovviamente devi aggiungere zero iniziali al numero più breve.

Le lettere sono solo numeri per il computer. Gli umani hanno assegnato numeri, ad esempio ASCII o Unicode , alle lettere in modo che il confronto dei numeri dia anche l'ordine "corretto" per le lettere.


Inoltre, questo è generalmente definito " ordine lessicografico ". Di solito possiamo pensarlo come un primo ordine per lunghezza (dal più breve al più lungo), quindi in ordine alfabetico.
usul

@usul Questo mi ricorda che i particolari del confronto tra numeri interi dipendono ovviamente dalla particolare codifica; quello che descrivo funziona con numeri binari "ingenui" che potrebbero essere lontani da ciò che utilizza una CPU effettiva.
Raffaello

Sì, assolutamente. Ho pensato troppo spesso a Turing Machines :). Le macchine reali non si adattano perfettamente a ciò che abbiamo detto qui tutto il tempo ....
usul

9

Non è il sistema operativo che confronta i numeri interi, la CPU se ne occupa. È realizzato a livello di porte logiche, fare riferimento a queste diapositive per vedere come si può fare.

Circa l'alfabeto, in ASCII alfanumerico e altri caratteri speciali sono rappresentati come numeri interi, quindi confrontarli è anche un'operazione di confronto di numeri interi, che viene eseguita dalla CPU.


4

In realtà, e per ottenerne l'immagine completa, penso che sarebbe molto utile vedere con i tuoi occhi il datapath di una CPU reale, ad esempio MIPS: inserisci qui la descrizione dell'immagine

Come puoi vedere, esiste effettivamente una seconda uscita dall'ALU, che è un segnale chiamato Zero. Esiste per eseguire operazioni di diramazione veloci, dopo aver determinato se i due operandi del confronto sono uguali a zero o meno , poiché la maggior parte dei confronti all'interno di un programma riguarda i rami. Pertanto, quando si crea una possibilità di diramazione nel codice come:

if (a <b) {...}

Questo si traduce in codice macchina, in MIPS ad esempio: BLT S0, S1, Se se a <b eseguire le istruzioni nelle staffe, se continuare con l'esecuzione di fuori del caso {}. Nello specifico questa istruzione è una pseudoistruzione, il che significa che è tradotta in altre due (semplici) istruzioni MIPS   
slt at, s0, s1 e poi bne at, zero, If (slt: Set Less Than & bne: Branch on Not Equal ).

Si noti che il segnale zero è uno degli ingressi della porta AND che determina da dove il Program Counter (PC) prenderà il suo valore da: Supponendo che il segnale Branch sia "1", poiché abbiamo un'operazione branch

  • Zero = 0
  • Zero = 1 Il risultato è stato 0 (a = b) e quindi il MUX sceglie l'indirizzo dal sommatore dove viene calcolato l'indirizzo dell'istruzione successiva in esecuzione normale (seriale). Non viene eseguito alcun salto poiché la condizione (a <b) non è valida.

Spero di averti aiutato a vedere "sotto il cofano". Sentiti libero di chiedere ulteriori analisi su questo argomento. Molte cose che diamo per scontate, le CPU le fanno in un modo molto affascinante!


Ethan, come funziona l'operazione "meno" su questo datapath? A quanto ho capito, hai descritto l'operazione "non uguale". Che cosa significa istruzione "slt"?
Osgx,

2

Se vuoi sapere come funziona una CPU reale, è qualcosa del genere.

Una CPU funziona solo con numeri fino a una certa dimensione. Oggigiorno di solito sono numeri interi a 64 bit (ignoreremo i numeri in virgola mobile; l'idea sarà simile).

Quindi dovremmo riconoscerlo

  1. Una CPU sta memorizzando numeri fino a (diciamo) lunghi 64 bit in binario, in qualche formato (probabilmente complemento a 2s ma non importa troppo).

  2. Una CPU non può fare nativamente nulla con numeri più grandi di così. Dobbiamo scrivere algoritmi software se vogliamo confrontare numeri più grandi.

un'B . Come li confronta il processore? Di solito, sottrarrà l'uno dall'altro (questa è una singola operazione nativa implementata nell'hardware).

un'-Bun'-Bè inferiore a zero. Lo fa con un'unica operazione nativa che potrebbe funzionare, a livello di circuito, come gli algoritmi di confronto descritti dalle altre risposte. Assomiglierà molto a quelli, ma tutti implementati nei circuiti (poiché il numero è a un massimo di 64 bit, questo è un circuito di determinate dimensioni che possiamo cablare e attaccare alla CPU.) A seconda di come la CPU memorizza i numeri, potrebbe essere anche più veloce perché potrebbe essere che tutti i numeri negativi abbiano il primo bit impostato su uno o qualcosa del genere. Ad ogni modo, ci sono solo 64 bit in totale, quindi possiamo sicuramente verificare se questo numero è negativo.

un'<Bun'B

Ora, per numeri più grandi, dobbiamo implementare qualcosa nel software che utilizzerà questi piccoli confronti come subroutine.


1

Per rispondere a questa domanda, vorrei prima sottolineare che ci sono almeno due livelli di astrazione per i numeri di confronto su un computer, il livello macchina e il livello software .

Confronto di numeri a livello di macchina

Nel computer di oggi la CPU ha un ricco set di istruzioni. Queste istruzioni includono ad esempio il caricamento di una cella di memoria in un registro, l'incremento di un registro, l'aggiunta di due registri e molti altri ancora. Ci devono essere anche istruzioni per i salti condizionati . Ad esempio, i processori della famiglia x86 di Intel supportano le istruzioni jnz(salta se non zero), jne(salta non uguale) e così via. Se mancassero quelli, la CPU non sarebbe completa. Le variabili dalle quali dipende il salto condizionale sono memorizzate nei registri. Pertanto, queste istruzioni sono cablate nell'architettura della CPU come un circuito costruito da porte logiche. Questo è l'unico modo in cui la CPU può confrontare due numeri.

Confronto di numeri a livello di software

Se si confrontano due numeri, ad esempio in un programma c ++, questo viene tradotto in codice macchina e quindi eseguito a livello di macchina. Tuttavia, tale confronto può essere più complesso. Dipende molto dal tipo di dati utilizzato come il confronto viene tradotto in codice macchina. Solo un esempio, i numeri che si desidera confrontare provengono dalle parole a 64 bit ma la macchina funziona solo con 32 bit. Quindi questo numero non rientra in un registro, quindi il compilatore suddividerà il confronto in una sequenza di confronti a livello di codice macchina. Lo stesso vale per tipi di dati / strutture di dati più complicati, che rappresentano ad esempio numeri razionali, stringhe o caratteri. Quindi quando devi confrontare due caratteri, questo è tradotto dal software (sistema operativo, compilatore, interprete, ...) in codice macchina.

Come osservazione finale, desidero sottolineare che le CPU standard possono funzionare anche con diverse rappresentazioni di numeri (numeri interi con segno nella rappresentazione con complemento a 1 o 2, float). Inoltre, è possibile effettuare confronti in altre parti del computer come la GPU.


0

le altre risposte sono buone, basta lanciarne un'altra là fuori per ulteriori considerazioni / approfondimenti con un sapore CS / twist. si può costruire un FSM , una macchina a stati finiti, in grado di confrontare due numeri binari di qualsiasi lunghezza, partendo a coppie dai bit più significativi e lavorando al bit meno significativo (LSB). può anche essere usato per concettualizzare il comparatore digitale fornito in un'altra risposta, ma l'FSM non richiede numeri binari di lunghezza finita. può anche funzionare su numeri interi con frazioni binarie dopo l'LSB. ha un sapore induttivo e ricorsivo e può essere dimostrato corretto con una semplice induzione. funziona come segue:

  • inserisci le prime due cifre binarie come coppia (a, b)
  • se a = 1 eb = 0 il numero a sinistra è più grande.
  • se a = 0 eb = 1, il numero giusto è più grande.
  • altrimenti i numeri sono "uguali fino ad ora", passare alla coppia successiva.

in altre parole il numero più grande è quello con la prima occorrenza di un bit che è uno e l'altro è zero, dopo una corsa iniziale di zero o più 1 identici. un comparatore digitale a lunghezza finita fatto di gate o comparatori a 1 bit può essere visto come basato sul fissare la lunghezza di questa operazione FSM su un numero fisso di bit. (sì, esiste una forte corrispondenza tra tutti i circuiti finiti e "fissare la lunghezza" dei calcoli degli FSM.)

questo può sembrare un esercizio teorico, ma in realtà la logica nel software per rappresentare numeri di precisione arbitrari opera qualcosa di analogo a questo FSM, tranne che è codificato in un loop di computer che può essere visto come loop over o simulare i passaggi di FSM (un'implementazione efficiente potrebbe tracciare tramite un indice la posizione dell'MSB).


inoltre, consente di interpretare / generalizzare ragionevolmente questa domanda come non limitato a numeri interi . la domanda si riferisce ai numeri interi ma il titolo si riferisce solo ai numeri. sorprendentemente nessun altro ha menzionato l' aritmetica in virgola mobile finora l' .

fondamentalmente funziona confrontando l' esponente e la mantissa in cui un numero è nella formaun'×10B, un'la mantissa, b l'esponente. la mantissa può essere normalizzata su un numero in cui la prima cifra è sempre diversa da zero. quindi per confrontare due numeri la logica prima confronta gli esponentiBe se sono disuguali, può restituire un risultato senza confrontare le mantisse (usando dire il circuito di confronto). se gli esponenti sono uguali, confronta le mantisse.

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.