Wie ermittelt der Computer, ob eine Zahl kleiner oder größer als eine andere ist?


34

Es mag sich nach einer dummen Frage anhören, aber ich bin wirklich neugierig zu wissen, wie ein Computer diese kennt . Woher weiß ein Computer, dass die Reihenfolge der Ganzzahlen und des Alphabets A, B, C, D, ... ist? Ist es irgendwo in der Hardware gespeichert oder liefert das Betriebssystem diese Art von Informationen?1 , 2 , 3 , 4 , 5 , 1<21,2,3,4,5,


1
Damit diese Frage zufriedenstellend beantwortet werden kann, müssen wir wissen, wie viel Ricky Stam über Computerarchitektur weiß. Aus der Frage sieht es nach sehr wenig aus, so dass keine der ausgefallenen Antworten für ihn nachvollziehbar sein wird.
Andrej Bauer

@AndrejBauer: Eigentlich hat er sich nicht angemeldet, seit er die Frage gestellt hat. Vielleicht weiß er jetzt alles, was er braucht.
Dave Clarke

Antworten:


31

Zuerst werden Ihre Ganzzahlen in Binärzahlen umgewandelt. Beispielsweise wird die Ganzzahl 2 in 0010 konvertiert.

Die CPU verwendet einen digitalen Komparator :

Ein digitaler Komparator oder Größenkomparator ist ein elektronisches Hardwaregerät, das zwei Zahlen als Eingabe in binärer Form verwendet und feststellt, ob eine Zahl größer oder kleiner oder gleich der anderen Zahl ist.

Komparatoren werden in Zentraleinheiten (CPU) und Mikrocontrollern eingesetzt.

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

In der Komparatorhardware werden einige Gatter verwendet (AND, OR, NAND, NOR, XOR usw.). Diese Gatter nehmen Binäreingänge an und geben ein binäres Ergebnis. Die Ausgabe ist aus einer Wahrheitstabelle ersichtlich.

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

Hier haben 0& 1sind elektronische Spannungen für das Tor.
1- Stellt eine Schwellenspannung dar, die eine positive Spannung anzeigt.
0- Stellt die Spannung dar, die unter dem Schwellenwert liegt.

Angenommen, ein Komparator arbeitet mit 5 Volt (dies wird zur Erklärung in Betracht gezogen), dann gilt: Eine
Spannung von mehr als 3 Volt kann als angesehen werden binary-1.
Spannung unter 3 Volt gilt alsbinary-0

Wenn ein Gatter einen Eingang als 3,5 Volt und einen anderen Eingang als 2 Volt erhält, wird ein Eingang als binär 1 und ein anderer Eingang als binär 0 betrachtet.

Diese Folgen von Einsen und Nullen werden sehr schnell durch den Schaltkreis geliefert.

Die Operation eines digitalen Zwei-Bit-Komparators kann als Wahrheitstabelle ausgedrückt werden:

 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

So zitieren Sie aus Wikipedia :

Beispiele: Betrachten Sie zwei 4-Bit-Binärzahlen A und B so, dass
Bildbeschreibung hier eingeben
Bildbeschreibung hier eingeben
hier jeder Index eine der Ziffern in den Zahlen darstellt.

Gleichberechtigung

Die Binärzahlen A und B sind gleich, wenn alle Paare signifikanter Ziffern beider Zahlen gleich sind, dh
Bildbeschreibung hier eingeben. Bildbeschreibung hier eingeben. Bildbeschreibung hier eingeben. Bildbeschreibung hier eingeben

Da die Zahlen binär sind, sind die Ziffern entweder 0 oder 1, und die Boolesche Funktion für die Gleichheit von zwei beliebigen Ziffern Bildbeschreibung hier eingebenund> Bildbeschreibung hier eingebenkann ausgedrückt werden als
Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben ist nur dann 1, wenn Bildbeschreibung hier eingebenund Bildbeschreibung hier eingeben gleich sind.

Für die Gleichheit von A und B müssen alle Bildbeschreibung hier eingebenVariablen (für i = 0,1,2,3) 1 sein. Damit kann die Qualitätsbedingung von A und B mit der UND-Verknüpfung als
Bildbeschreibung hier eingeben
Die binäre Variable (A = B) implementiert werden. ist nur dann 1, wenn alle Ziffernpaare der beiden Zahlen gleich sind.

Ungleichheit

Um manuell die größere von zwei Binärzahlen zu bestimmen, untersuchen wir die relativen Größen von Paaren signifikanter Stellen, beginnend mit dem höchstwertigen Bit, und nähern uns allmählich den niedrigstwertigen Bits, bis eine Ungleichung gefunden wird. Wenn eine Ungleichung gefunden wird, wenn das entsprechende Bit von A 1 ist und das von B 0 ist, schließen wir, dass A> B ist. Dieser sequentielle Vergleich kann logisch ausgedrückt werden als:

Bildbeschreibung hier eingeben


2
Whoa, was ist hier los?
Gilles 'SO- hör auf böse zu sein'

1
"Zuerst werden Ihre Ganzzahlen in Binärzahlen umgewandelt" ... falsch, es befinden sich nur Binärzahlen im Speicher an erster Stelle, alle Einsen und Nullen in der Maschinenebene, also gibt es keine "Umwandlung", 2 ist dargestellt als 10 von Anfang bis Ende ..
Dr.Haimovitz

Wenn Sie Material aus anderen Quellen kopieren, müssen Sie Ihre Quellen ordnungsgemäß zuordnen. Sehen Sie hier und hier .
DW

Die digitale Zwei-Bit-Vergleichstabelle ist falsch. ijesi.org/papers/Vol(2)1%20(version%202)/C211324.pdf Wenn A1, A0 beide Null sind, B0 und B1 jedoch 0 sind, ist 1 A> B beispielsweise 0.
user1455116

14

Es "weiß" nicht nur, es prüft jedes Mal. Grundsätzlich macht es das Gleiche, was Sie tun würden: Um zu vergleichen, prüft es (von links), welche Zahl die erste Ziffer hat, die größer ist als die entsprechende in der anderen Ziffer. Natürlich müssen Sie der kürzeren Zahl führende Nullen hinzufügen.

Buchstaben sind nur Zahlen für den Computer. Menschen haben Buchstaben Zahlen, z. B. ASCII oder Unicode , zugewiesen, damit Zahlenvergleiche auch für Buchstaben die "richtige" Reihenfolge ergeben.


Dies wird üblicherweise auch als " lexikografische Reihenfolge " bezeichnet. Wir können es uns normalerweise so vorstellen, dass wir zuerst nach Länge (kürzeste bis längste) und dann alphabetisch sortieren.
Usul

@usul Das erinnert mich daran, dass die Einzelheiten des Vergleichs von ganzen Zahlen offensichtlich von der jeweiligen Codierung abhängen. Was ich beschreibe, funktioniert für "naive" Binärzahlen, die weit davon entfernt sind, was eine tatsächliche CPU verwendet.
Raphael

Ja, absolut. Ich habe in letzter Zeit zu viel über Turing Machines nachgedacht :). Echte Maschinen passen nicht immer ganz zu dem, was wir hier gesagt haben ...
usul

9

Es ist nicht das Betriebssystem, das ganze Zahlen vergleicht, die CPU kümmert sich darum. Es wurde auf der Ebene der logischen Gatter erstellt. Informationen dazu finden Sie auf diesen Folien .

Über das Alphabet werden in ASCII alphanumerische und andere Sonderzeichen als Ganzzahlen dargestellt, so dass das Vergleichen auch eine Ganzzahlvergleichsoperation ist, die von der CPU durchgeführt wird.


4

Eigentlich, und um ein vollständiges Bild davon zu erhalten, halte ich es für sehr hilfreich, den Datenpfad einer tatsächlichen CPU, beispielsweise MIPS, mit eigenen Augen zu sehen: Bildbeschreibung hier eingeben

Wie Sie vielleicht sehen, gibt es tatsächlich einen zweiten Ausgang von der ALU, nämlich ein Signal namens Zero. Es ist vorhanden, um schnelle Verzweigungsoperationen durchzuführen, nachdem festgestellt wurde, ob die beiden Vergleichsoperanden gleich Null sind oder nicht , da es sich bei den meisten Vergleichen in einem Programm um Verzweigungen handelt. Wenn Sie daher eine Verzweigungsmöglichkeit in Ihrem Code erstellen, wie folgt:

if (a <b) {...}

  

Beachten Sie, dass das Signal Null einer der Eingänge des UND-Gatters ist, der bestimmt, woher der Programmzähler (PC) seinen Wert bezieht: Angenommen, das Verzweigungssignal ist '1', da wir eine Verzweigungsoperation haben

Hoffe, ich habe dir geholfen, "unter der Haube" zu sehen. Bitte fragen Sie nach weiteren Analysen zu diesem Thema. Viele Dinge sind für uns selbstverständlich, CPUs tun dies auf faszinierende Weise!


Ethan, wie funktioniert "weniger" Betrieb auf diesem Datenpfad? Soweit ich weiß, haben Sie die Operation "ungleich" beschrieben. Was bedeutet "slt" Anweisung?
osgx

2

Wenn Sie wissen möchten, wie eine tatsächliche CPU dies tut, ist dies in etwa so.

Eine CPU arbeitet nur mit Zahlen bis zu einer bestimmten Größe. Heutzutage sind das normalerweise 64-Bit-Ganzzahlen (wir werden Gleitkommazahlen ignorieren; die Idee wird ähnlich sein).

Das sollten wir also erkennen

  1. Eine CPU speichert Zahlen mit einer Länge von bis zu (sagen wir) 64 Bit im Binärformat (wahrscheinlich 2s-Komplement, aber es spielt keine Rolle, was passiert).

  2. Eine CPU kann mit größeren Zahlen nichts anfangen. Wir müssen Softwarealgorithmen schreiben, wenn wir größere Zahlen vergleichen wollen.

einb

aba-bist kleiner als Null. Dies geschieht mit einer einzelnen systemeigenen Operation, die auf Schaltungsebene wie die von den anderen Antworten beschriebenen Vergleichsalgorithmen funktionieren kann. Es wird ähnlich aussehen, aber alle sind in Schaltkreisen implementiert (da die Anzahl maximal 64 Bit beträgt, ist dies ein Schaltkreis mit einer bestimmten Größe, den wir fest verdrahten und auf der CPU festhalten können.) Abhängig davon, wie die CPU Zahlen speichert, ist dies der Fall könnte sogar noch schneller sein, weil es sein könnte, dass bei allen negativen Zahlen das erste Bit auf eins gesetzt ist, oder so ähnlich. In beiden Fällen gibt es insgesamt nur 64 Bit, sodass wir definitiv prüfen können, ob diese Zahl negativ ist.

ein<beinb

Für größere Zahlen müssen wir jetzt etwas in Software implementieren, das diese kleinen Vergleiche als Subroutinen verwendet.


1

Lassen Sie mich zur Beantwortung dieser Frage zunächst darauf hinweisen, dass es mindestens zwei Abstraktionsebenen für die Vergleichsnummern auf einem Computer gibt, die Maschinenebene und die Softwareebene .

Zahlen auf Maschinenebene vergleichen

In heutigen Computern verfügt die CPU über einen umfangreichen Befehlssatz. Diese Anweisungen umfassen beispielsweise das Laden einer Speicherzelle in ein Register, das Inkrementieren eines Registers, das Hinzufügen von zwei Registern und vieles mehr. Es muss auch Anweisungen für bedingte Sprünge geben . Beispielsweise unterstützen die Prozessoren in der x86-Familie von Intel die Anweisungen jnz(Sprung, wenn nicht Null), jne(Sprung ungleich) usw. Wenn diese fehlen würden, wäre die CPU nicht vollständig. Die Variablen, von denen der bedingte Sprung abhängt, werden in den Registern gespeichert. Daher sind diese Befehle in der Architektur der CPU als eine aus logischen Gattern aufgebaute Schaltung fest verdrahtet. Nur so kann die CPU zwei Zahlen vergleichen .

Vergleichen von Zahlen auf Softwareebene

Wenn Sie zwei Zahlen vergleichen, beispielsweise in einem c ++ - Programm, wird dies in Maschinencode übersetzt und daher auf Maschinenebene ausgeführt. Ein solcher Vergleich kann jedoch komplexer sein. Es hängt wirklich vom verwendeten Datentyp ab, wie der Vergleich in Maschinencode übersetzt wird. Nur ein Beispiel: Die Zahlen, die Sie vergleichen möchten, stammen aus den 64-Bit-Wörtern, aber Ihr Computer arbeitet nur mit 32-Bit-Wörtern. Dann passt diese Nummer nicht in ein Register, daher zerlegt der Compiler den Vergleich in eine Folge von Vergleichen auf der Maschinencodeebene. Gleiches gilt für kompliziertere Datentypen / Datenstrukturen, die beispielsweise rationale Zahlen, Zeichenketten oder Zeichen darstellen. Wenn Sie also zwei Zeichen vergleichen müssen, müssen Sie dies per Software (Betriebssystem, Compiler, Interpreter, ...) in Maschinencode übersetzen.

Abschließend möchte ich darauf hinweisen, dass Standard-CPUs auch mit unterschiedlichen Darstellungen von Zahlen arbeiten können (vorzeichenbehaftete Ganzzahlen in 1- oder 2-Komplement-Darstellung, Floats). Vergleiche können auch in anderen Teilen des Computers wie der GPU durchgeführt werden.


0

andere antworten sind gut, wirf einfach eine andere raus, um weitere Überlegungen / Einblicke mit einem CS-Flair / Twist anzustellen. man kann eine FSM , eine endliche Zustandsmaschine, konstruieren , die zwei Binärzahlen beliebiger Länge vergleichen kann, wobei paarweise von den höchstwertigen Bits bis zum niedrigstwertigen Bit (LSB) begonnen wird. Es kann auch verwendet werden, um den digitalen Komparator zu konzipieren, der in einer anderen Antwort angegeben ist, jedoch erfordert der FSM keine Binärzahlen mit endlicher Länge. Es kann sogar ganze Zahlen mit binären Brüchen nach dem LSB verarbeiten. es hat ein induktives und rekursives Aroma und kann durch einfache Induktion als richtig erwiesen werden. es läuft wie folgt ab:

  • Geben Sie die ersten beiden Binärziffern als Paar ein (a, b)
  • Wenn a = 1 und b = 0 ist, ist die linke Zahl größer.
  • Ist a = 0 und b = 1, ist die richtige Zahl größer.
  • ansonsten sind die Zahlen "bis jetzt gleich", weiter zum nächsten Paar.

Mit anderen Worten, die größte Zahl ist diejenige mit dem ersten Auftreten eines Bits, das eins ist, und die andere ist null, nach einem anfänglichen Lauf von null oder mehr identischen Einsen. Ein digitaler Komparator endlicher Länge, der aus Gattern oder 1-Bit-Komparatoren besteht, beruht auf der Festlegung der Länge dieser FSM-Operation auf eine feste Anzahl von Bits. (Ja, es gibt eine starke Übereinstimmung zwischen allen endlichen Schaltungen und der "Festlegung der Länge" von FSM-Berechnungen.)

Dies mag wie eine theoretische Übung erscheinen, aber tatsächlich funktioniert die Logik in der Software zur Darstellung von Zahlen mit willkürlicher Genauigkeit etwas Analoges zu dieser FSM, außer dass sie in einer Computerschleife codiert ist, die als Schleife über die Schritte der FSM angesehen werden kann oder diese simuliert (eine effiziente Implementierung) könnte über einen Index die Position des MSB verfolgen).


Lassen Sie uns diese Frage auch so interpretieren / verallgemeinern, dass sie nicht auf ganze Zahlen beschränkt ist . Die Frage bezieht sich auf ganze Zahlen, aber der Titel bezieht sich nur auf Zahlen. überraschenderweise erwähnte bisher niemand eine Gleitkomma-Arithmetik .

ein×10beinb

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.