Magische Zahl (Informatik)
ein bestimmtes Dateiformat kennzeichnender Wert am Dateibeginn Aus Wikipedia, der freien Enzyklopädie
ein bestimmtes Dateiformat kennzeichnender Wert am Dateibeginn Aus Wikipedia, der freien Enzyklopädie
Eine Magische Zahl (englisch magic number) hat in der Programmierung drei Bedeutungen:
0x12345678
).Eine frühe Konvention in unixartigen Betriebssystemen war, dass Binaries mit zwei Bytes anfingen (Magic Bytes), die eine „Magische Zahl“ enthielten, 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 Dateityp identifiziert. So fängt XML mit der speziellen Zeichenfolge „<?xml
“ an, die die Datei 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:
0x63825363
.0xCAFEBABE
.GIF89a
‘ (0x474946383961
) oder ‚GIF87a
‘ (0x474946383761
)0xFFD8FF
an und enthalten weiterhin die ASCII-Entsprechung für ‚JFIF
‘ (0x4A464946
).\211 P N G \r \n \032 \n
(0x89504e470d0a1a0a
)MThd
‘ (0x4D546864
) gefolgt von Metadaten.#!
‘ (0x23
0x21
), gefolgt von einem Pfad zum Interpreter (z. B. ,#!/usr/bin/perl
‘ für Perl)MZ
‘ (0x4D5A
) oder auch selten ‚ZM
‘ (0x5A4D
), den Initialen des Erfinders dieses Formats, Mark Zbikowski, siehe MZ-Datei.0x19540119
oder 0x011954
je nach Version; beides ist das Geburtsdatum des Designers Marshall Kirk McKusick.Joy!
‘ (englisch für Freude!; hexadezimal 0x4A6F7921
).II
oder MM
an, abhängig von der Endianness („II“ entspricht Intel und „MM“ Motorola), gefolgt von 0x2A00
oder 0x002A
(im Dezimalsystem 42).PK
, den Initialen ihres Erfinders Phil Katz. Das betrifft aber auch andere mit dem Deflate-Algorithmus komprimierte Dateien, wie z. B. die Microsoft Office-Formate DOCX, XLSX und PPTX.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. Die eigentliche „Magie“ liegt in der Datei /usr/share/misc/magic.mgc
(unter Debian /usr/share/file/magic.mgc
).
Hexadezimalzahlen werden oft dazu benutzt, Werte auf Datenträgern oder 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‘ (also englisch für „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 „lesbare“ Werte wie 0xABABABAB
, 0x00C0FFEE
oder 0x0BADF00D
(englisch ‚bad food‘, etwa „schlechtes Essen“) ersetzt werden.
Da ein solcher Wert selten vorkommt (bei Gleichverteilung von 32-Bit-Zahlen mit einer Wahrscheinlichkeit von 1:232 = 1:4.294.967.296, nach dem Benfordschen Gesetz sogar seltener), wird er oft von Softwareentwicklern dazu benutzt, Fehler wie Pufferüberläufe oder uninitialisierte 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, die 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 und auch bei den 1990 eingeführten RS/6000-Servern von IBM zu Diagnosezwecken benutzt.
Auch dezimale Zahlen werden dazu verwendet, z. B. um bei Konzepten und/oder Präsentationen Zahlen „ein Gesicht zu geben“, Platzhalter zu sein, aber gleichzeitig für alle verständlich anzuzeigen, dass der bestimmte Wert der Zahl völlig belanglos ist. Gern gewählt wird im Programmiererumfeld der Wert 42, der im SF-Roman Per Anhalter durch die Galaxis von einem allwissenden Computer als Lösung aller Probleme verkündet wird. Andere Beispiele sind bekannte „Allerwelts-Zahlen“ wie „08/15“ (deutsches Maschinengewehr aus den Weltkriegen) oder „4711“ (bekannte Parfümmarke).
Beispiel: »Der Kunde „4711“ bestellt den Artikel „08/15“. Ein anderer Kunde „42“ bestellt diesen Artikel auch. Was soll passieren, wenn nur ein Artikel „08/15“ vorrätig ist?«
Der Term magische Zahl (englisch ‚magic number‘, oft auch ‚hard coded value‘) bezeichnet auch den schlechten Programmierstil, Werte unmittelbar zwischen die Befehle des Quellcodes zu schreiben. Das macht in vielen Fällen Programmcode schwerer lesbar und unverständlich. Besser ist es meistens, Zahlen mit Bedeutung als Konstante festzulegen und so mit einem aussagekräftigen Namen zu versehen. Außerdem lässt sich so eine Zahl besser im gesamten Code ändern, da oft andere Zahlen von ihr abhängen. Auch bei einer einmaligen Verwendung könnte eine namentliche Konstante vorzuziehen sein. Man spricht hier von einer explanatory variable, zu deutsch einer (selbst) erklärenden Variable, deren Zweck ist, den Code für Menschen lesbarer zu machen. Die in ihrer Länge begrenzte Benamung tritt zumindest bei einmaliger Verwendung aber auch in deutliche Konkurrenz mit allfälligen Möglichkeiten zur direkten inline-Kommentierung des code.
Ein Beispiel in Pascal-ähnlichem Pseudocode, das 52 Zahlen in einem Feld (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 Feld. 52 ist dabei eine magische Zahl. Besserer Stil ist das folgende Programm:
constant int cardGame_deckSize:= 52 for i from 1 to cardGame_deckSize { j:= i + randomInt(cardGame_deckSize + 1 - i) - 1 swapEntries(i, j) }
Die Vorteile hier sind:
cardGame_deckSize
einfach ein auch sogenannter Parameter gemacht werden. Beispiel:function shuffle (int cardGame_deckSize) { for i from 1 to cardGame_deckSize { j:= i + randomInt(cardGame_deckSize + 1 - i) - 1 swapEntries(i, j) } }
cardGame_dekcSize
getippt, wird der Fehler schon vom Compiler erkannt.Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.