Privacy Policy Cookie Policy Terms and Conditions Magische Zahl - Wikipedia

Magische Zahl

aus Wikipedia, der freien Enzyklopädie

Dieser Artikel behandelt die Magischen Zahlen in der Informatik, für die Bedeutung in der Physik, siehe Magische Zahlen

Eine Magische Zahl (engl. magic number) ist in der Programmierung eine spezieller Wert, der für einen bestimmten Zweck genutzt wird.

Magische Zahlen werden meistens ausgewählt aus:

  • ASCII (meistverwendet)
  • hexadezimale Repräsentation von Zahlen (beispielsweise 305419896 = 0x12345678)
  • Manchmal wird Hexspeak verwendet

Inhaltsverzeichnis

[Bearbeiten] Magische Zahlen zur Kennzeichnung von Dateitypen

Eine frühe Konvention in Unix-artigen Betriebssystemen war, dass Binaries mit zwei Bytes anfingen, die eine "Magische Zahl" einhielten, die den Typ der Datei angibt. An Anfang wurden damit Objektdateien für verschiedene Plattformen gekennzeichnet. Nach und nach wurde diese 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 einem speziellen Tag 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:

  • kompilierte Java Klassendateien (Bytecode) beginnen mit 0xCAFEBABE auf big-endian-Systemen.
  • GIF-Bilddateien enthalten am Anfang den ASCII-Code für 'GIF89a' (0x474946383961) oder 'GIF87a' (0x474946383761)
  • JPEG-Bilddateien fangen mit 0xFFD8FF an, und JPEG/JFIF-Dateien enthalten den ASCII code für 'JFIF' (0x4A464946) bzw. (0x45786966).
  • PNG-Bilddateien beginnen mit einer 8-byte-Signatur die die Datei als PNG identifiziert und eine Erkennung von Dateiübertragungsproblemen ermöglicht: \211 P N G \r \n \032 \n (0x89504e470d0a1a0a)
  • Standard-MIDI-Dateien enthalten den ASCII-Code für 'MThd' (0x4D546864) gefolgt von Metadaten.
  • Shellscripts starten normalerweise mit einem Shebang, '#!' (0x2321, oder 0x2123 auf little-endian-Systemen) gefolgt von einem Pfad zum Interpreter.
  • Alte MS-DOS .exe Dateien und neuere Microsoft Windows PE (Portable Executable). exe starten mit dem ASCII-Code 'MZ' (0x4D5A), die Initialen des Erfinders dieses Formats, Mark Zbikowski.
  • Der Berkeley Fast File System Superblock wird identifiziert durch 0x19540119 oder 0x011954 je nach Version; Beides ist das Geburtsdatum des Designers Marshall Kirk McKusick.
  • Programme für den Game Boy und Game Boy Advance haben eine 48 oder 156 Byte lange magische Zahl. Diese Zahl enkodiert ein Bitmap des Nintendo-Logos.
  • Alte Fat binaries (die Code für sowohl den 68K- als auch den PowerPC-Prozessor enthalten) auf Mac OS 9 beginnen mit dem ASCII-Code von 'Joy!' (engl. Freude!) (0x4A6F7921).
  • TIFF-Bilddateien fangen mit "II" oder "MM", abhängig von der Endianess (II entspricht Intel, MM entspricht Motorola), gefolgt von 0x2A00 bzw. 0x002A (im Dezimalsystem 42).

Das Programm file liest und interpretiert magische Zahlen aus Dateien.

[Bearbeiten] Magische Zahlen in Protokollen

[Bearbeiten] Magische Zahlen in Code

Der Term magische Zahl (engl. magic number) bezeichnet auch den schlechten Programmier-Stil Zahlen direkt im Quellcode zu benutzen. In den meisten Fällen macht dies Programme schwerer lesbar und unverständlich. Besser ist es, 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 ith und jth 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:

  • Einfacher zu verstehen. Ein Programmierer, der das erste Programm liest, wird sich nach der Bedeutung der 52 fragen, und eventuell lange suchen, bevor er den Sinn dahinter erfasst.
  • Einfacher zu ändern. Wenn man im oberen Beispiel die magische Zahl ändern möchte, muss man weitere Zahlen ändern. In größeren Programmen wird dies extrem unübersichtlich. Es entstehen Fehler, die man später aufwendig suchen muss. Im Gegensatz dazu muss man im unteren Beispiel lediglich eine einzige Zeile ändern.
  • Sämtliche magische Zahlen befinden sich am Anfang des Programmes, so dass man den Überblick behält.
  • Es vereinfacht Parametrisierung. Soll also das obige Programm beliebig große Arrays mischen, kann man aus deckSize einfach einen Parameter machen. Beispiel:
function shuffle (int deckSize)
for i from 1 to deckSize
j:= i + randomInt(deckSize + 1 - i) - 1
swapEntries(i, j)
  • Tippfehler werden vermieden. Der Compiler wird kein Problem haben, wenn man statt 52 die Zahl 62 tippt, das Programm wird aber nicht ordnungsgemäß funktionieren. Tippt man dagegen dekSize, wird der der Fehler schon vom Compiler erkannt.

Nachteile sind:

  • Der Code wird verlängert. Wenn viele Konstanten in einer Zeile genutzt werden, müssen Zeilenumbrüche eingefügt werden.
  • Es erschwert das Debugging auf Systemen, auf denen die Werte von Konstanten nicht angezeigt werden.

[Bearbeiten] Magische Zahlen in der Programmierung

0xDEADBEEF (dezimal: 3.735.928.559) ist eine Zahl in hexadezimaler Notation, die als "dead beef" (engl. Totes Rindfleisch) gelesen wird.

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). 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 oder 0xBAADF00D (engl. "bad food", etwa "schlechtes Essen") ersetzt werden.

Da der 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.

[Bearbeiten] Referenzen

THIS WEB:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2006:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu