05.01.1 Ganzzahlige Typen, Zweierkomplement
This is a modal window.
Das Video konnte nicht geladen werden, da entweder ein Server- oder Netzwerkfehler auftrat oder das Format nicht unterstützt wird.
Formale Metadaten
Titel |
| |
Serientitel | ||
Anzahl der Teile | 110 | |
Autor | ||
Lizenz | CC-Namensnennung - keine kommerzielle Nutzung - Weitergabe unter gleichen Bedingungen 3.0 Deutschland: Sie dürfen das Werk bzw. den Inhalt zu jedem legalen und nicht-kommerziellen Zweck nutzen, verändern und in unveränderter oder veränderter Form vervielfältigen, verbreiten und öffentlich zugänglich machen, sofern Sie den Namen des Autors/Rechteinhabers in der von ihm festgelegten Weise nennen und das Werk bzw. diesen Inhalt auch in veränderter Form nur unter den Bedingungen dieser Lizenz weitergeben. | |
Identifikatoren | 10.5446/9505 (DOI) | |
Herausgeber | ||
Erscheinungsjahr | ||
Sprache | ||
Produzent |
Inhaltliche Metadaten
Fachgebiet | |
Genre |
Informatik 1, Winter 2010/201141 / 110
1
2
3
5
6
8
10
12
13
19
25
26
27
30
32
39
42
47
48
49
53
54
55
56
58
59
61
64
66
67
69
70
71
72
78
79
81
82
83
87
92
93
94
96
97
98
99
101
102
106
107
108
109
110
00:00
Negative ZahlMultiplikationPositive ZahlSubtraktionÜbertragZahlRechenmaschineRechenwerkSkriptspracheDezimalzahlZahlenbereichKopfrechnenMulti-Tier-ArchitekturAdditionDivisionTyp <Informatik>VariableMathematikRechnenGanze ZahlNullBitSpeicher <Informatik>Übersetzer <Informatik>BinärdatenIntelLESC++Computeranimation
Transkript: Deutsch(automatisch erzeugt)
00:01
Ich habe Ihnen schon zwei Typen verraten. In C und C++ hat jede Variable einen Typ. Wir hatten schon zwei Typen, int für ganze Zahlen und bool für Variablen, die wahr oder falsch speichern können. Natürlich gibt es noch viel mehr Typen, davon möchte ich Ihnen heute ein paar antun.
00:24
Bevor ich damit starte, muss ich aber erst erklären, wie dann überhaupt intern die Zahlen gespeichert werden, für den Lückentext Nummer eins. Wenn ich 16-Bit-Zahlen habe, diese Maschine hier, der MSP430, arbeitet bevorzugt mit 16-Bit-Zahlen.
00:43
Wenn Sie so eine 16-Bit-Zahl haben, was heißt das eigentlich? Man kann das ganz einfach machen und sagen, 16 Nullen hintereinander. Oh, da hat man was zu schreiben. Wenn alle von diesen 16-Bits null sind, was soll das heißen?
01:05
Dezimal für uns menschliche Betrachter. Wahrscheinlich einfach Null, wenn alle Bits auf Null sind. Wenn da lauter Nullen stehen und das letzte Bit ist gesetzt, soll das wohl eins heißen?
01:21
Wenn da lauter Nullen stehen und am Ende steht Null von mir aus 11, soll das ungefähr was heißen? Drei, genau. Und so weiter und so fort. Wenn da lauter Einsen stehen, Kopfrechnen, 1 plus 2 plus 4 plus 8 plus 16,
01:42
es gibt einen Trick, um das einfacher zu rechnen. Wenn Sie eins drauf addieren, was passiert, wenn Sie da eins zu dieser Binärzahl addieren? Alles zu Null und vorne eine Eins. Sie kriegen einen Übertrag. Das ist so, als ob Sie Dezimal 999 haben und eins addieren,
02:01
dann wird es 1000 werden. Wenn Sie hier eins dazu addieren, eins plus eins macht Null, eins im Sinn, eins plus eins macht Null, eins im Sinn und so weiter, es wird 1000000. Also 16 Einsen ist nichts anderes als 2 hoch 16, 1000000 minus eins. 2 hoch 16 minus eins.
02:21
Wird das werden. Das kann ich jetzt auch noch nicht auf alle Stellen im Kopf. 2 hoch 16 minus eins. 65000535.
02:40
65000535. Das ist, wenn alle Einsen gesetzt werden. Das ist die naive Art, wie man übersetzen kann. Von Binär nach Dezimal kommt auch vor. Ist aber nicht das, was typischerweise passiert. So würden Sie direkt Binärzahlen in Dezimalzahlen übersetzen.
03:02
Der Ärger bei dieser Übersetzung ist, dass ich keine negativen Zahlen habe. Das haben Sie aber schon gesehen. Wir können negative Zahlen bauen. Hier gäbe es keine negativen Zahlen. Ich würde immer 16 bit speichern. Aber ich hätte keine Chance, negative Zahlen zu machen. Alle diese Zahlenmuster,
03:20
bei denen vorne eine Eins steht, den gibt man eine andere Bedeutung. Hier ab in der Mitte sind wir hier irgendwo bei 1000. Den Zahlenmustern gibt man alle eine andere Bedeutung. Das werden nachher die negativen Zahlen.
03:42
Und zwar, insbesondere wird, das habe ich im Skript, für den Lückentext Nummer 2, da war ich zu faul, die bits hinzuschreiben, also 0XFFFD. Dieser hier, wenn Sie das in bits ausschreiben,
04:02
wird das was? Was ist das F in bits ausgeschrieben? Erinnert sich noch einer? 411, wunderbar. 411, nochmal 411. Das D ist schwieriger. In bits? Ne, 1010 ist es noch nicht. Das wäre nämlich 1 mehr als das hier.
04:23
Was ist das? 1001. Wollen Sie es übersetzen? 9, genau. Das ist 9. Dann ist 1010. Also was für ein Buchstabe? A und dann ist 1011B.
04:40
Und 110 ist C. 1101 ist D. Dieser hier, das wäre dieses Bitmuster, der wird, absurderweise, Lückentext 2, warum heißt das eigentlich Lückentext? Ich bin ein bisschen blöd. Der wird nicht 65.000.
05:03
Wie viel wäre das, wenn Sie es umrechnen? Dezimal, ganz üblich. Das ist alle einzengesetzt. 65.535. Wie viel wäre das dann?
05:21
Genau, 2 weniger, das ist der Punkt. Denn hier fehlt mir die 2. Es ist 1 plus 4 plus 8 und so weiter und die 2. Also 2 weniger. 65.533. 65.533. Lückentext, ich erinnere mich. Absurderweise sagt man jetzt nicht mehr, das ist 65.533,
05:43
sondern, das wird gleich in einem eigenwilligen Spiel minus 3 werden. Das sehen Sie doch offensichtlich, dass es minus 3 ist. Ich versuche Ihnen den Trick zu vermitteln, warum das minus 3 sein muss. Ja, ja, genau.
06:01
Also, alle diese Zahlen hier mit der 1 vorne kriegen eine andere Bedeutung. Das werden plötzlich die negativen Zahlen. Das heißt, man kann auch relativ einfach ablesen, was negative Zahlen sind. Man guckt sich das erste Bit an. Wenn das erste Bit gesetzt ist, hat man eine negative Zahl.
06:23
Ich führe Ihnen vor, dass das sinnvoll ist. Dass man sagt, das hier machen wir mal zur Zahl minus 3. Das ist für den Lückentext 4. Wenn Sie nämlich jetzt Folgendes rechnen. 0xfffd. Dieses Bitmuster, wie es da steht. Wenn Sie zu dem Bitmuster
06:40
5 addieren. 00005. Probieren wir das mal. Wenn Sie das tatsächlich tun. Vielleicht soll ich das mal ausführlich hinschreiben. Das ist dann also 1111 1111 1111 1101.
07:03
Und dazu addiere ich 5. 0000 0000 0000 Was ist das Bitmuster für die 5? 101, wunderbar. Wenn ich das tatsächlich tue. Machen wir das jetzt mal ganz wie Adam Riese
07:20
zu Fuß hier. Nur mit Binärzahlen statt Dezimalzahlen. 1 plus 1. Was schreibe ich hin? 0 und 1 im Sinn. Also Sie haben bei Dezimalzahlen 5 und 5 0 und 1 im Sinn. Bei Binärzahlen 1 und 1. 0 und 1 im Sinn. Hier habe ich jetzt 0 und 0 und 1 im Sinn. Das macht 1.
07:41
Hier kommt 1 und 1. Das macht 0. Und 1 im Sinn. 1 und den Übertrag macht 0 und 1 im Sinn. 1 und den Übertrag macht 0 und 1 im Sinn. Blablablabla. Hier vorne werde ich haben 1 und 1 im Übertrag 0. Und hier ein 17. Bit
08:00
blöderweise. Ein 17. Bit von dem Übertrag. Das wird das Ergebnis sein. Also wenn Sie das hier hinschreiben, wäre das Hexadezimal 0x 1. 0, 0, 0 und hinten steht welche Zahl?
08:21
0, 0, 1, 0 ist Hexadezimal 2. Was müsste eigentlich rauskommen? Was wollten eigentlich raus haben? Minus 3. Diese Zahl soll minus 3 sein nach meiner neuen Interpretation.
08:40
Was hätte ich eigentlich raus haben wollen? Minus 3 plus 5. Ich hätte eigentlich 2 raus haben wollen. Ich habe nicht ganz 2 raus bekommen. Sie sehen, ich habe diesen Übertrag. Aber das Schöne ist, dieser Übertrag hier ist im 17. Bit. Das haben wir gar nicht mehr, das 17. Bit. Das fliegt einfach raus bei der Rechnung. Wir haben gar keinen Platz für das 17. Bit. Das fliegt weg bei der Rechnung. Und Sie sehen wunderbar, ich rechne FFFD
09:02
plus 5 macht 2. Na toll. Dieses FFFD verhält sich also genau wie sich die Zahl minus 3 verhalten sollte. Weil der Übertrag wegfliegt. Das ist der Trick an der Stelle. Man rechnet ohne Übertrag. Modulo 2 hoch 16. Wenn sich irgendjemand noch an Mathematik erinnert,
09:20
haben wir irgendwann etwas erzählt zur Gruppe, glaube ich, nebenbei. Rechnung Modulo 2 hoch 16 ist das. Deshalb funktioniert das. Dieser Übertrag fliegt raus. Und dadurch wird tatsächlich diese Zahl in Anführungszeichen minus 3 sich auch so verhalten, wie sich die minus 3 verhalten muss. Diese Zahl plus 5 macht 2.
09:42
Und das geht durch mit der Addition, mit der Subtraktion und mit der Multiplikation. Ich habe das nochmal mit der Multiplikation vorgeführt. Das ist da auch nochmal sehen. Mit der Subtraktion, offensichtlich, haben wir da keinen Ärger. Mit der Multiplikation geht es auch durch. Die Eleganz von dem Ganzen ist,
10:02
dass man mit ein und demselben Rechenwerk positive und negative Zahlen verarzen kann. Ich muss ja diese Rechenoperation hier, was heißt ich? Nicht ich, sondern Texas Instruments oder Intel oder AMD muss diese Rechenoperation in Transistoren gießen. wenn man es schafft, nicht nochmal
10:21
einen separaten Satz an Transistoren für negative Zahlen einzubauen, wäre das doch total hilfreich. Und hiermit schafft man das. Sie benutzen dieselbe Maschine für positive Zahlen wie für negative Zahlen. Das ist dieselbe Rechenmaschine. Das Einzige, was ich mache, ist, dass ich diese Zahlen anders lese.
10:41
Diese Zahl lese ich nicht als 65.500 Blas, sondern ich lese sie als Minus 3. Ich rechne dasselbe, aber ich habe eine andere Interpretation dafür. Die selben Transistoren machen eine anschaulich andere Aufgabe. Die Transistoren machen dasselbe, was sie vorher gemacht haben, aber ich
11:00
interpretiere das Ergebnis anders. Plötzlich habe ich negative Zahlen. Nur noch die Hälfte. Genau. Sie haben nur noch die Hälfte an Zahlen. Genau. Das ist der Preis, den man zahlt. Sie halbieren den Zahlenumfang, haben dafür aber negative Zahlen.
11:21
Diese Darstellung nennt sich Zweierkompliment. Es gibt auch andere Möglichkeiten, negative Zahlen darzustellen. Sie können einfach das oberste Bit setzen und sagen, jetzt ist das Ding negativ. Das ist eine andere Möglichkeit. Aber diese Darstellung hier ist die übliche. Zweierkompliment nennt sich das, weil man so schön einfach damit rechnen kann.
11:44
Ich wollte das noch mit der Multiplikation zeigen, dass das auch mit der Multiplikation durchgeht. Also es geht mit Addition, Subtraction, Multiplikation. Bei Division muss man aufpassen. Division ist sowieso eklig zu bauen. Da kann man die paar Spezialbefehle dann tatsächlich noch einbauen in den Rechner. Als Beispiel für die Multiplikation,
12:00
wenn ich sowas rechnen will, Minus 7 mal Minus 10 in dieser Darstellung, dann baue ich das um, indem ich rechne 2 hoch 16 Minus 7. Ich speichere nicht die Minus 7, sondern was ich abspeichere als Bitmuster ist 2 hoch 16 Minus 7.
12:22
Das haben wir hier schon. Das hier ist nicht 65.000 ist nicht so viel, sondern es ist 2 hoch 16 Minus 3. Ich speichere 2 hoch 16 Minus 7
12:41
statt der Minus 7. Und ich speichere 2 hoch 16 Minus 10 statt der Minus 10. Eigentlich. Das sind die Bitmuster, die da entstehen. Wenn Sie gucken, was dann passiert, wenn ich das hier ich schaue mal hier in Anführungszeichen.
13:01
Wenn ich das hier ausrechne mit der normalen Mathematik 2 hoch 16 mal 2 hoch 16 sind 2 hoch 32. Dann kommt 2 hoch 16 mal Minus 10, also Minus 10 mal 2 hoch 16. Dann kommt 7 mal 2 hoch 16. Und es kommt 7 mal 10 plus 7 mal 10.
13:24
Alle diese hier verschwinden im Überlauf. Das sind Vielfache von 2 hoch 16. Also Zahlen, bei denen die letzten 16 Bits 0 sind. 2 hoch 32, das sind die letzten 16 Bits, 10 mal 2
13:41
16, 16 Bits, 0 und so weiter und so fort. Alle diese werden im Überlauf versteckt und es kommt das richtige Ergebnis raus. 7 mal 10. Nur als grobe Idee, dass das auch mit der Multiplikation funktionieren wird. Mit der Division, wie gesagt, wird's eklig. Ist sowieso eklig. Aber Addition, Subtraction, Multiplikation laufen durch in diesem Zweierkompliment. Ein und dieselbe Maschine
14:02
rechnet mit positiven Zahlen und mit negativen Zahlen. Durch diesen Rechentrick.