| Dieser Artikel oder Abschnitt bedarf einer Überarbeitung. Näheres ist auf der Diskussionsseite angegeben. Hilf bitte mit, ihn zu verbessern, und entferne anschließend diese Markierung. |
Eine Magische Zahl (engl. magic number) ist in der Programmierung ein spezieller Wert, der für einen bestimmten Zweck genutzt wird.
Magische Zahlen werden meistens ausgewählt aus:
Inhaltsverzeichnis |
Eine frühe Konvention in unixartigen Betriebssystemen war, dass Binaries mit zwei Bytes anfingen, die eine „Magische Zahl“ einhielten, die den Typ der Datei angibt. Am Anfang wurden damit Objektdateien für verschiedene Plattformen gekennzeichnet. Nach und nach wurde dieses Konzept auch auf andere Dateien übertragen, und mittlerweile findet sich in fast jeder Binärdatei eine magische Zahl.
Viele andere Typen von Dateien haben einen Inhalt, der den Dateitypen identifiziert. So fängt XML mit den speziellen Zeichen <?xml an, der die Datei einwandfrei als XML kennzeichnet. Wandelt man diesen Dateianfang in eine Zahl um, kann man anhand eines einfachen Vergleiches schnell den Dateityp bestimmen, ohne viel über das Format wissen zu müssen.
Einige Beispiele:
Das Unix-Kommando file liest und interpretiert magische Zahlen aus Dateien. Auch das Linux-Kernelmodul binfmt_misc erkennt anhand magischer Zahlen den Dateityp einer Anwendung.
Der Term magische Zahl (engl. magic number) bezeichnet auch den schlechten Programmier-Stil, Zahlen direkt im Quellcode zu benutzen. In vielen Fällen macht dies Programme schwerer lesbar und unverständlich. Besser kann es sein, Zahlen mit Bedeutung als Konstante zu definieren und so mit einem Namen zu versehen. Außerdem lässt sich so eine Zahl besser im gesamten Code ändern, da meistens andere Zahlen von ihr abhängen.
Ein Beispiel in Pseudocode, das 52 Zahlen in einem Array mischt:
for i from 1 to 52 j:= i + randomInt(53 - i) - 1 swapEntries(i, j)
Die Funktion randomInt(x) generiert eine Zahl zwischen 1 und x, und swapEntries(i, j) vertauscht die Einträge i und j im Array. 52 ist dabei eine magische Zahl. Besserer Stil ist das folgende Programm:
constant int deckSize:= 52 for i from 1 to deckSize j:= i + randomInt(deckSize + 1 - i) - 1 swapEntries(i, j)
Die Vorteile daran sind:
function shuffle (int deckSize) for i from 1 to deckSize j:= i + randomInt(deckSize + 1 - i) - 1 swapEntries(i, j)
Nachteile sind:
Hexadezimalzahlen werden oft dazu benutzt, Werte auf Datenträgern bzw. anderem Speicher darzustellen. Die meisten Zahlen sehen dabei recht "uninteressant" und "zufällig aus". Manchmal ist es aber vorteilhaft, einen sofort auffallenden Wert zu haben (beispielsweise bei der Fehlersuche).
0xDEADBEEF (dezimal: 3.735.928.559) ist eine Zahl in hexadezimaler Notation, die als „dead beef“ (engl. Totes Rindfleisch) gelesen wird.
Normalerweise tritt ein Wert wie 0xDEADBEEF eher selten auf und wird somit dazu verwendet, besondere Werte anzuzeigen. Die Zahl an sich hat dabei keine spezielle Bedeutung und kann genauso durch andere Werte wie 0xABABABAB, 0x00C0FFEE oder 0xBAADF00D (engl. „bad food“, etwa „schlechtes Essen“) ersetzt werden.
Da ein solcher Wert selten vorkommt (mit einer Wahrscheinlichkeit von 1:2^32 = 1:4294967296), wird er oft von Softwareentwicklern dazu benutzt, Fehler wie Pufferüberläufe oder uninitalisierte Variablen zu finden bzw. zu untersuchen. Wenn der Wert also im Speicher auftaucht, sollte der Programmierer sich diese Stelle genauer ansehen. Auch werden zu Debuggingzwecken Speicherbereiche, welche vom Programm nicht beschrieben werden sollten, mit 0xDEADBEEF vollgeschrieben. Schreibt das Programm in diesem Bereich, wird es sofort bemerkt.
Viele Versionen des PowerPC-Prozessors initialisieren ihre Register mit 0xDEADBEEF nach einem Hardware-Reset. 0xDEADBEEF wurde im originalen Mac-OS-Betriebssystem zu Diagnosezwecken benutzt, und sichtbarer auch bei den 1990 eingeführten RS/6000-Servern von IBM.
Siehe auch: Hexspeak, für die Transskription von Wörtern in hexadezimale Zahlen.