05.03.1 Überlauf, Teilen durch Null
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/9508 (DOI) | |
Herausgeber | ||
Erscheinungsjahr | ||
Sprache | ||
Produzent |
Inhaltliche Metadaten
Fachgebiet | |
Genre |
Informatik 1, Winter 2010/201144 / 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
MaximumPositive ZahlNegative ZahlZahlBitCompilerTyp <Informatik>FehlermeldungSystemzusammenbruchWINDOWS <Programm>NormalvektorSoundverarbeitungPufferüberlaufVorzeichen <Mathematik>Computeranimation
Transkript: Deutsch(automatisch erzeugt)
00:00
Was für ein Unsinn kann ich jetzt mit diesen ganzzahligen Typen veranstalten? Diese Geschichte mit dem Überlauf, das war ja für dieses Zweierkompliment extrem wichtig, dass die Rechnung mit dem Zweierkompliment, mit den negativen Zahlen funktioniert, die hat ihre Hake. Wenn ich hier, sagen wir mal, die Zahl 30.000 habe
00:25
und jetzt nehme ich zu der Zahl 30.000, die da in A steht, nochmal 30.000 dazu. Dann würde ich erhoffen, dass in B nachher 60.000 stehen.
00:41
Was ist das Problem? B kann aber niemals die 60.000 speichern, denn er hat ja nur 16 BIT vorzeichenbehaftet. Da geht nur bis 32.000 noch was. Die überstehenden BITs werden einfach abgeschnitten bei der Rechnung.
01:02
A ist 30.000, jetzt addiere ich 30.000 auf A. Und Sie sehen, B ist minus 5.536, alles andere als wir haben wollten. Das ist extrem gefährlich. Sie kriegen mal ebenso einen Überlauf, nennt sich das dann, wenn die oberen BITs abgeschnitten werden.
01:22
Anscheinend ist das höchste BIT jetzt gesetzt, deshalb hält er die Zahl für negativ. Das Ergebnis ist ziemlich blödsinnig, aus menschlicher Sicht. Also Vorsicht, das bleibt verborgen. Wenn so ein Überlauf stattfindet, Overflow, kriegen Sie das erstmal nicht mit.
01:40
Für die Zweierkompliment-Rechnung muss das so sein, sonst würde es ja nicht ordentlich funktionieren. Aber das kann einen ganz schön beißen. Ein blödes Beispiel, wo man das mal sehen kann, habe ich ins Skript geschrieben, die einen das beißen kann. Dass die vermeintlich positiven Zahlen plötzlich ins negative umschlagen. Wenn Sie die folgende Schleife, nichts Böses ernten, folgende Schleife eintippen,
02:07
was habe ich da, eine Million, eins, zwei, drei, eins, zwei, drei, folgende Schleife eintippen, und da soll jetzt in der Schleife irgendwas passieren, keine Ahnung was da passieren soll, da wird etwas dazwischen stehen.
02:23
So, das sieht doch ganz normal aus, eine Schleife eine Million mal durchführen. Das sollte das Ding ja mal so gerade nebenbei machen. Laufen, nichts passiert, etwas langsamer. Mal gucken, wo wir gerade sind, hier mit der roten Hand anhalten.
02:43
I ist 5000, bisschen langsamer, 5000. Oh, gucken Sie sich den an, I ist minus 17000. Was passiert? Er wird diese eine Million nie erreichen, er zählt bis zu seinem Maximum.
03:00
Hier auf der Maschine ist es ein 16-Bit mit Vorzeichen, das heißt, er zählt bis 32.000 noch was, und dann addiert er eins zu und hat plötzlich minus 32.000 noch was, und fängt dann bei minus 32.000 wieder an, bis 32.000 noch was, eins dazu. Dieses Ding, diese Schleife endet nie, Vorsicht an der Stelle. Also diese Overflow, dieser Überlauf, der ignoriert wird, der kann ein Extrem beißen.
03:25
Wundern Sie sich nicht über solche Effekte, haben Sie das immer im Hinterkopf. Punkt eins, dieser Überlauf wird praktischerweise nie angezeigt. In der Sprache C sharp kann man sich eine Warnung geben lassen an der Stelle,
03:45
aber hier in C ignoriert man ihn typischerweise, gefährlich, gefährlich, Punkt eins. Eine andere Geschichte, die dieser Compiler zumindest ignoriert, ist folgendes. Wenn ich sage int A gleich Null und int B ist gleich 34 durch A,
04:08
dann findet dieser Compiler das soweit in Ordnung und rechnet auch locker mal 34 durch Null und kriegt minus eins raus. Vorsicht, auch das scheint ein Problem zu sein, dass er hier was Verbotenes tut und uns das nicht mitteilt.
04:25
Üblicherweise, das ist eigentlich ein ungewöhnliches Verhalten, üblicherweise bricht das Programm an der Stelle ab. Also wenn Sie dasselbe hier machen mit Visual C++, dem normalen Windows-Compiler, kriegen Sie einen schönen Programmabsturz mit der Fehlermeldung.
04:42
Hier wurde durch Null geteilt, Pech gehabt, Ende für heute. An dieser Stelle scheint dieser Compiler hier etwas freundlicher oder toleranter zu sein. Sie können locker durch Null teilen und kriegen dann minus eins raus. Also je nachdem, welchen Compiler Sie haben, gibt das Ärger beim Teilen durch Null oder keinen Ärger beim Teilen durch Null.