Woran erkennt ein Computer ob er das Zweierkomplement umrechnen muss?

6 Antworten

Pass auf... Ich habe die ganze Zeit überlegt, wie ich Dir das erklären kann. Dann fiel mir ein ganz einfaches Beispiel ein.

Nehmen wir mal den Computer, der nur binär rechnen kann. Und der kann wirklich nichts anderes.

Wenn ich dem ungefiltert sagen würde: 1 + 1, würde er 10 ausgeben. Denn das ist für den Computer im Binären absolut logisch. Damit der Computer also richtig rechnen kann, muss ich ihm über einen "Filter" erst einmal sagen, in welchem Format ich die Zahlen eingebe.

Um das zu verdeutlichen, ändern wir die Aufgabe in 2 + 1. Der Computer würde Error ausgeben, weil 2 eine Datenform ist, die er nicht beherrscht.

Also setze ich dem Computer eine Art Dolmetscher zur Seite und sage ihm:
INTEGER 2 + 1. Der Computer weiß nun, in welchem Nachschlagewerk er diese komische Ziffer nachschlagen soll. Und er weiß 2 + 1 = 10 + 1 und er weiß, dass ist binär 11. Also schaut er in das Wörterbuch und weiß, Binär 11 ist INTEGER 3.

Bei Umrechnungen von Integerwerten in zum Beispiel Hexadezimale Zahlen, legt man einfach das Eingabewörterbuch und das Ausgabewörterbuch manuell fest. Und da auch eine negative Integerzahl im Wörterbuch steht, kann er diese auch in Binär übersetzen und auf Wunsch dann in jede andere Zahlenform umwandeln.

Ich hoffe, dass dieses kleine Textchen nun deine Frage beantwortet.

Nochmal kurz: Zahl -> Eingabefunktion zu Binär -> Berechnung -> Ausgabefunktion (wie Eingabe) -> Endergebnis


AntharHD 
Fragesteller
 31.01.2017, 21:55

Vielen vielen Dank, sehr gutes Beispiel!

0

Das ist etwas kompliziert zu erklären.

Wenn du in einer Hochsprache (z.B. C) einfach nur 2 Zahlen miteinander addierst, dann ist es Aufgabe des Kompilers dies in Maschinensprache umzusetzen.

Um dir das folgende zu erklären, muss ich dir kurz erzählen wie ein Prozessor aufgebaut ist. Das Herzstück des Prozessors ist die ALU (Arithmetische Logische Einheit). Das ist das eigentliche Rechenwerk. In ihr befinden sich die Register für die Operanden (x86: 4 ; x64 4 + 8). Die vier Standardregister heißen AX, BX, CX, DX. In ihr müssen die Werte geladen werden. Anschließend kann man irgendwelche Operationen ausführen (zum Beispiel 2 Operanden durch einen Volladder jagen) und anschließend die Register wieder zurück in den Speicher schreiben.

Zusätzlich zu diesen Registern gibt es noch ein Statusregister (auch Flag-register genannt). Dieses Register gibt auskunft über das Ergebnis der LETZTEN Operation. Darunter zählt unter anderem das SIGN-Flag.

Und jetzt wird dabei die Pfanne fettig: Wenn du etwas in die Register schiebst (MOV) dann kann man das auf mehrere Möglichkeiten machen:

Du kannst die Werte einfach 1:1 reinkopieren. Das würde man mit MOV machen. Du kannst auch MOVZX (unsigned) und MOVSX (signed) nutzen.

So stehen bei dem Kopiervorgang die Flags je nachdem wie du es willst. Und das beeinflusst dann den Addierungsbefehl (ADD).

Du musst nämlich wissen: Es gibt nicht nur einen Befehl je Mnemonik (diese kleinen Abkürzungen hier). Auf Mikroebene sind das sehr sehr viele Befehle. Welcher da richtig übersetzt wird, das ist einzig und alleine Aufgabe des Kompilers und des Linkers. Auf gut Deutsch: MOV AX, BX ist ein anderer Maschinenbefehl als MOV BX, 0xFFFF.

Darum braucht sich aber der Anwender oder Programmierer zum Glück nicht kümmern. Die einzigen, die das wissen müssen sind die Menschen die die Prozessoren herstellen und jemand, der vielleicht einen Kompiler schreibt.

Jetzt hast du alles schön addiert und kannst die Werte wieder zurückschreiben.

Aber wer muss denn nun wissen, welchen MOV-Befehl ich ansetze? Ganz einfach: Das macht der Kompiler für dich. Denn wenn du jetzt programmierst und irgendwo hinschreibst "unsigned int bla", dann ist die Variable bla ja eindeutig als nichtvorzeichenbehafteter Integer deklariert. Und diese Informationen werden dann beim Übersetzen deines Programms berücksichtigt.

Ich hoffe ich konnte dir das einigermaßen näher bringen.

Falls dich das etwas mehr interessiert, kannst du ja mal nach "x86 Instruction Set" suchen. Da findest du die Prozessorbefehle alle einzelnd.

Gruß
Omni



AntharHD 
Fragesteller
 31.01.2017, 21:54

Vielen Dank, echt super erklärt!

1
Omnivore13  01.02.2017, 16:00
@AntharHD

Gern geschehen.

Das Thema ist aber sehr komplex. Aber wie gesagt, wenn dich das mehr interessiert, weißt du ja jetzt wonach du suchen musst.

0

Ein Computer kann NUR im Binärsystem rechnen. Was anderes, als Strom an oder Strom aus bekommt er ja nunmal nicht hin. Was er Dir dann ausspuckt, hat etwas mit der Anwendung zu tun, die Du zum rechnen nutzt. Und was er da ausspuckt, haben findige Programmierer ihm beigebracht.


rumar  31.01.2017, 18:27

Ich nehme an, dass AntharHD eben gerade diesen "findigen Programmierern" etwas genauer auf die Spur kommen möchte :   und dazu wünsche ich ihm weiteres Interesse und eine ordentliche Portion Hartnäckigkeit !

1

Das ist schon definiert, wenn sie genutzt werden. Diese Art von Dingen/Problemen ist (größtenteils) schon gelöst(, sage ich mal ins Blaue).

Beim programmieren wählt der Programmierer die Variablen(-Arten/-Typen) und damit auch die Zahlenbereiche des Programmes. Damit ist das dann im voraus geregelt.

Das passiert alles bei der Variablendefinition.


rumar  31.01.2017, 18:41

Hallo nahtzieher !

Eigentlich ist es ja schön, dass wir heute so ziemlich darauf vertrauen können, dass unsere Computer (und Taschenrechner und Smartphones und Heizungsregelungen und ABS- , ESP- , GPS-Geräte und so weiter) im Allgemeinen ziemlich verlässlich funktionieren. 

Aber eben:  All diese Dinge gibt es erst seit wenigen Jahrzehnten oder bloß nur seit einigen Jahren. Dahinter stecken gewaltige Entwicklungen und sehr viel Arbeit von x-Tausenden von cleveren Leuten.

Ich finde es sehr gut, dass es auch heute (und hoffentlich noch sehr, sehr lange) Menschen gibt, die sich für die Wurzeln dieser Entwicklungen brennend interessieren.    

1

Er erkennt es daran, dass im Byte an erster Stelle eine 1 (statt einer 0) steht.

Diese 1 sagt, dass das Byte als (Binär-) Darstellung einer negativen Zahl zu interpretieren ist. 

Ob das Byte tatsächlich zur Darstallung vorzeichenbehafteter Zahlen dient (oder stattdessen nur zur Darstellung nicht negativer ganzer Zahlen), muss der Compiler dem Sourcecode zum Programm entnehmen.

Lies mehr dazu an Stelle https://de.wikipedia.org/wiki/Zweierkomplement#Motivation .


grtgrt  31.01.2017, 19:46

Mit anderen Worten: Ob das Zweierkompliment tatsächlich gebildet werden muss, entscheidet der Compiler.

0