Magische Zahl (Informatik)

Eine Magische Zahl ( englisch magische Zahl ) hat in der Programmierung drehbar Bedeutungen:

  1. Ursprünglich aus der Unix – Welcome community, ist ein spezieller Wert, ein einheitliches Dateiformat am Dateiverzeichnis (Wer ist zum Beispiel der Unix-Befehl Datei auswertet).
  2. Ein kleiner Wert , um ein Register oder einen Speicherbereich zu markieren, der später einen Debugger auf Fehler untersucht werden soll. Solke markering Magische Zahlen wurden zu folgenden Domaen ausgewählt:
    • ASCII (Freundin)
    • hexadezimale Darstellung von Zahlen (Beispiel 305419896 = 0x12345678)
    • Manchmal wird Hexspeak verdorben
  3. Ein im Quellcode eines Programms auftauchender Zahlenwert (auch engl. “ Hard coded value “ genannt), was bedeutet, dass es nicht möglich ist, read-seine Bedeutung zu erkennen ist so „magisch“. Derbische Magische Zahlen sind zu verstehen und zu verstehen. Constant definitions of contracts, the name Benennung and Her- force.

Magische Zahlen zur Kennzeichnung von Dateitypen

Eine frühe Konvention in unixartigen Betriebssystem Krieg that Binaries Mit zwei Bytes anfangen, stirbt eine „Magische Zahl“ enthalten, stirbt die Typ der Datei angibt. Am Anfang gerechnet werden DAMIT Objektdateien Amt für verschiedene Plattform gekennzeichnet. Nach und nach war das Konzept auch auf andere Termine, und noch wichtiger, Sie finden sich in einer besseren Weise.

Viele andere Arten von Dateien haben einen Inhalt, identifier den Date Pen. So fängt XML mit der Speziellen Zeichenfolge “ <?xml“ ein, sterben stirbt Datei als XML kennzeichnet. Walking man diesen Dateianfang in einer Zahl, kann man einen einfachen Vergleich durchführen, ohne fallen in diesem Format.

Einzelne Beispiele:

  • Der Set of Weight Loss Networking-Parameter von BOOTP / DHCP- Protokolle beginnt mit meinem Magic Cookie 0x63825363.
  • Kompilierte Java Class Dates ( Bytecode ) beginnen mit 0xCAFEBABE.
  • GIF- Date Enthalten ist Anfang der ASCII- Code für, GIF89a ‚(0x474946383961) oder GIF87a‘ (0x474946383761)
  • JPEG / JFIF -Dates erfassen mit 0xFFD8FF und außer für ASCII-Entscheidung für, JFIF ‚(0x4A464946).
  • PNG -Dateien Beginn mit Einem 8-Byte – Magie Byte, stirbt Datei als PNG identifiziert und Eine Erkennung von Dateiübertragungsproblemen ermöglicht sterben: \ 211 PNG \ r \ n \ 032 \ n (0x89504e470d0a1a0a)
  • Standard MIDI- Date Entities nach ASCII-Zeichenfolge, MThd ‚(0x4D546864) aus Metadaten.
  • Unix – Scripte aller Art Start Normaleweise mit einem Shebang ,, #! ‚ (0x23 0x21), gefolgt von einem eigenen Pfadz-Interpreter (z. B. #! / Usr / bin / perl ‚für Perl )
  • MS-DOS – EXE -Dateien und Microsoft Windows – PE-Dateien (Portable Executable) beginnen mit dem ASCII-Zeichen, MZ ‚(0x4D5A) BZW. verkaufen auch, ZM ‚(0x5A4D), die Initialen des Erfinders dieses Formate, Mark Zbikowski .
  • Der Berkeley-Fast-File-System – Superblock wird durch 0x19540119 oder 0x011954 identifiziert Sie Nach Version; ist das Geburtsdatum des Designers Marshall Kirk McKusick .
  • Programm für den Game Boy und Game Boy Advance mit 48 oder 156 Byte langer magischer Zahl. Diese Zahl kodiert ein Bitmap des Nintendo- Logos.
  • Alte Fat Binaries (der 68K Code- sowie PowerPC Prozessor Entities) auf Mac OS 9 beginnen mit der ASCII-Zeichenfolge von, Joy! ‚ (Engl. Freude! ) (0x4A6F7921).
  • Das TIFF-Datum erfasst meine „II“ oder „MM“ und bleibt von der Endianness (Sekundär Intel, MM Centers Motorola) gefolgt von 0x2A00 bzw. 0x002A (in Dezimalsystem 42 ).

Dein Unix-Kommando fileund interpretierte Magie Zahlen aus Dateien. Auch das Linux-Kernelmodul binfmt misc hat den Zauberer Zahlen der Datenitep einer Anwendung erkannt. Die Eigentumslizenz „Magie“ liegt in der Datei /usr/share/misc/magic.mgc(unter Debian /usr/share/file/magic.mgc).

Magic Zahlen als Markierung in der Programmierung

Es wurden oft Hexadezimalzahlen verwendet. Anderer Speicher darzustellen. Die Mädchen Zahlen sehen dabei rechts „uninteressant“ und „zufallig“ aus. (ZB bei der Fehlersuche).

0xDEADBEEF (dezimal: 3735928559) is a Zahl in hexadezimaler Notation, sterben als “ tote Rind “ (engl Totes Rindfleisch.) Gelesen Wird.

Normalerweise up ein Wert Wie 0xDEADBEEF eher selten auf und Wird SOMIT dazu used, besondere Werte anzuzeigen. Die Zahl an sich hat dabei keine Spezielle bedeutung und Kann genauso Durch andere „lesbar“ Werte Wie 0xABABABAB, 0x00C0FFEE oder 0x0BADF00D (engl. “ Schlechtes Essen “ ETWA „schlechtes Essen“) Ersetzt Werden.

Als sich ein einzelner Wert selten erwies (betteln 32-Bit-Zahlen mit einer Wahrhaftigkeit von {\ displaystyle 1: 2 ^ {32} = 1: 4.294.967.296}, nach ihnen Benfoderschen Gesetz sogar selten), oft von Softwareentwicklern, Fehler, Pufferüberläufen oder uninitialisierten Variablen verwendet. Zu unterscheiden. Wenn der Wert auch in Speicher auftaucht, sollte der Programmierer diese Stelle genau sehen. Auch wurden Debuggingzwecken Speicherbereiche genannt, die Von Programm nicht beschreiben, sollen, mit 0xDEADBEEF. Schreibe das Programm in den Bereich, werde sofort darauf hingewiesen.

Viele Versionen von PowerPC Prozessoren Initials Registrieren Sie sich mit 0xDEADBEEF nach einem Hardware Reset. 0xDEADBEEF wurde im Original Mac OS – Betriebssystem und auch von 1990 eingeführt RS / 6000- Server von IBM zu Diagnosezwecken eingesetzt.

Auch dezimale Zahlen waren dazu verwöhnt, z. B. bei Konzept und / oder Präsentationen Zahlen „ein Gesicht zu geben“ Platz Halter zu sein, aber gleichzeitig für alle verständlich anzuzeigen that der Bestimmt Wert der Zahl Völlig belanglos ist. Beilip Geist Zahlen, der 08/15 oder 4711 in einer Problemstellung war: Der Kunde mit der Nummer 4711 bestellte den Artikel 08/15. Ein anderer Kunde 4812 bestellt diesen Artikel auch. Gab es einen Pass, wenn nur ein Artikel 08/15 vorrätig ist? .

Magic Zahlen im Code

Der Term magische Zahl (engl. „Magic Number“), oft auch „hard coded value“ genannt, bezeichnet auch den programmierlichen Wert, Werte direkt nutzen Quellcode zu. Deine Macht fiel Fällen Programmcode schwerer lesbar und unverständlich. Besser kann es sein, Zahlen mit Bedeutung als Constant zu definieren und mit Namen zu vershen. Lässt sich so eine Zahl besser im geordneten Code ändern, da können andere Zahlen von ihr abhängen.

Ein Beispiel in Pseudocode , das 52 Zahlen in einem Array falsch:

für i von 1 bis 52
{
 j: = i + randomInt (53 - i) - 1
 swapEinträge (i, j)
}

Die Funktion randomInt(x)Generiert Eine Zahl between 1 und x , und swapEntries(i, j)vertauscht sterben eintragen in und j im Array. 52 ist dabei eine magische Zahl. Besserer ist das folgende Programm:

Konstante  int cardGame_deckSize 52 =
 für die in von einem zwei cardGame_deckSize
{
 j: = i + randomInt (cardGame_deckSize + 1 - i) - 1
 swapEntries (i, j)
}

Der Vortex hier Geist:

  • Einfacher zu verstehen. Eines der Programme, die die wichtigsten Programme sind, ist die Sinn Dahinter Vererbung.
  • Einfacher zu ändern. Wenn man im Gegensatz zB die magische Zahl ändern möchte, muss man weitere Zahlen ändern. Bei den Griechen wird das Programm das extrem unübersichtlich. Es sollte Fehler, der Mann späte aufwändig suchen muss. Im Gegensatz dazu muss man im unteren Beispiel.
  • Das Ganze Einwohnerzahlen befindet sich am Eingang des Programms, also war es der Moment.
  • Vorinfizierte Parametrisierung. Soll das obige Programm? Big arrays, kann man cardGame_deckSize einfach einen Parameter machen. beispiel:
Funktion shuffle ( int cardGame_deckSize)
{ für in aus einem zwei cardGame_deckSize
 {
 j: = i + randomInt (cardGame_deckSize + 1 - i) - 1
 swapEntries (i, j)
 }
}
  • Tippfehler wurden vermieden. Da Compiler wird kein Problem Das Problem ist, dass du 52 hast, dass Zahl 42 fallen gelassen hat, das Programm hat nicht richtig funktioniert. Tippt man tag cardGame_de kc Größe , wird der Fehler schon vom Compiler quittiert.

Nachteile

  • Der Code wird verlängert. Wenn viele Konstanten in Einer Zeile rekrutiert wurden, wurden Stückenumbrüche eingefügt.
  • Dies ist der Fall bei Debugging on Systems, da die Werte von Constantine ignoriert wurden. (Wir sehen uns hier und sehen das Debugging bei der Verwendung eines symbolischen Debuggers.)
  • Bei nicht sinnvoll eingeführter Constant muss der Leser ggf. Wir freuen uns auf die Definition der Definition.

Siehe auch

  • Metasyntaktische Variable

Referenzen

  • Dateisignaturtabelle (Englisch)
  • PNG-Dateisignatur, Begründung (Englisch)
  • Hex Kuriositäten (Englisch)