Magische Zahl (Informatik)

Eine Magische Zahl (englisch magic number) hat in der Programmierung drei Bedeutungen:

  1. Ursprünglich aus der Unix-Welt kommend, ist sie ein spezieller Wert, der ein bestimmtes Dateiformat am Dateibeginn kennzeichnet (wie ihn zum Beispiel der Unix-Befehl file auswertet).
  2. Ein auffälliger Wert, um ein Register oder einen Speicherbereich zu markieren, der später mittels eines Debuggers auf Fehler untersucht werden soll. Solche markierende Magische Zahlen werden meistens aus folgenden Domänen ausgewählt:
    • ASCII (meistverwendet).
    • Hexadezimale Repräsentation von Zahlen (beispielsweise 305419896 = 0x12345678).
    • Manchmal wird Hexspeak verwendet.
  3. Ein im Quellcode eines Programms auftauchender Zahlenwert (auch englisch hard coded value genannt), dessen Bedeutung sich nicht unmittelbar erkennen lässt – seine Bedeutung ist somit „magisch“. Derartige Magische Zahlen sind zu vermeiden und durch gut benannte Konstantendefinitionen zu ersetzen, deren Namen, Bedeutung und Herkunft klar angegeben ist.

Magische Zahlen zur Kennzeichnung von Dateitypen

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:

  • Die Stelle mit wichtigen Netzwerkparametern des BOOTP/DHCP-Protokolls beginnt mit einem (hexadezimalen) Magic Cookie 0x63825363.
  • kompilierte Java-Klassendateien (Bytecode) beginnen mit 0xCAFEBABE.
  • GIF-Dateien enthalten am Anfang den ASCII-Code für ‚GIF89a‘ (0x474946383961) oder ‚GIF87a‘ (0x474946383761)
  • JPEG/JFIF-Dateien fangen mit 0xFFD8FF an und enthalten weiterhin die ASCII-Entsprechung für ‚JFIF‘ (0x4A464946).
  • PNG-Dateien beginnen mit einem 8-Byte-MagicByte, welches 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 die ASCII-Zeichenfolge ‚MThd‘ (0x4D546864) gefolgt von Metadaten.
  • Unix-Scripte aller Art starten normalerweise mit einem Shebang, ‚#!‘ (0x23 0x21), gefolgt von einem Pfad zum Interpreter (z. B. ,#!/usr/bin/perl‘ für Perl)
  • EXE-Dateien für MS-DOS sowie Microsoft-Windows-EXE und -DLLs starten mit den ASCII-Zeichen ‚MZ‘ (0x4D5A) oder auch selten ‚ZM‘ (0x5A4D), den Initialen des Erfinders dieses Formats, Mark Zbikowski, siehe MZ-Datei.
  • 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 kodiert 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 der ASCII-Zeichenfolge von ‚Joy!‘ (englisch für Freude!; hexadezimal 0x4A6F7921).
  • TIFF-Dateien fangen mit II oder MM an, abhängig von der Endianness („II“ entspricht Intel und „MM“ Motorola), gefolgt von 0x2A00 oder 0x002A (im Dezimalsystem 42).
  • ZIP-Dateien beginnen mit 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).

Magische Zahlen als Markierung in der Programmierung

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?«

Magische Zahlen in Code

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:

  • Einfacher zu verstehen. Ein Programmierer, der das erste Programm liest, wird sich nach der Bedeutung der 52 fragen, und womöglich lange suchen, bevor er den Sinn dahinter erfasst. Das Problem entsteht aber auch dann nicht, wenn der Sinn des Gesamtprogramms bekannt ist, wie bei einem Kartenspiel mit regelgerechter Anzahl von Karten.
  • Einfacher zu ändern. Wenn im oberen Beispiel die magische Zahl nachträglich programmweit geändert werden soll, muss die davon abhängende 53 ebenfalls geändert werden. In größeren Programmen kann solch eine Vorgehensweise sehr unübersichtlich und aufwendig werden. Es können Fehler entstehen, die später sehr aufwendig behoben werden müssen und unter Umständen sehr schwer auszumachen sind. Im Gegensatz dazu muss im unteren Beispiel lediglich in der ersten Zeile die Definition der Konstante geändert werden. Dem wäre aber auch dadurch zu begegnen, dass nicht „53“ geschrieben würde, sondern „52 + 1“.
  • Alle bedeutsamen Zahlen befinden sich am Anfang des Programmes, sodass der Überblick nicht verloren gehen kann.
  • Vereinfachte Parametrisierung. Soll das obige Programm beliebig große Felder mischen, kann aus 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)
  }
}
  • Tippfehler werden vermieden. Der Compiler wird kein Problem haben, wenn statt 52 die Zahl 42 getippt wurde, das Programm wird aber nicht ordnungsgemäß funktionieren. Wird dagegen cardGame_dekcSize getippt, wird der Fehler schon vom Compiler erkannt.
  • Es erleichtert jedoch sehr das Debugging bei Verwendung eines symbolischen Debuggers.

Siehe auch

Read other articles:

Michał HellerNama dalam bahasa asli(pl) Michał Heller BiografiKelahiran12 Maret 1936 (88 tahun)Tarnów Floruit (en)2001 Data pribadiAgamaKatolik dan Gereja Katolik Roma PendidikanUniversitas Katolik Yohanes Paulus II Lublin John Paul II High School in Tarnów (en) KegiatanSpesialisasiTeologi dan filsafat PekerjaanAstronom, filsuf, penulis, imam Katolik, Imam dan teolog Bekerja diUniversitas Arizona Ruhr University Bochum (en) University of Leicester (en) Universitas Katolik Amerika Universi...

 

Burung kejur Dasyornis Rufous bristlebird (Dasyornis broadbenti)TaksonomiKerajaanAnimaliaFilumChordataKelasAvesOrdoPasseriformesFamiliPardalotidaeGenusDasyornis Vigors dan Horsf., 1827 SpeciesDasyornis brachypterus Dasyornis broadbenti Dasyornis longirostris †Dasyornis walterbolesilbs Burung-kejur adalah keluarga burung pengicau, Dasyornithidae . Terdapat tiga spesies dalam satu genus, Dasyornis . Keluarga ini endemik di pantai tenggara dan sudut barat daya Australia . [1] Genus Das...

 

Prasasti loh tanah liat berisi perjanjian antara raja Alaksandu dengan Muwatalli. Sekarang disimpan di Museum Troya, Turki. Alaksandu (bahasa Het: 𒀀𒆷𒀝𒊭𒀭𒁺𒍑, translit. Alâkšândûš), juga dieja sebagai Alakasandu atau Alaksandus, adalah seorang raja Wilusa yang menyetujui sebuah perjanjian dengan seorang raja Het bernama Muwatalli II, sekitar tahun 1280 SM.[1] Perjanjian ini menyiratkan bahwa Alaksandu sebelumnya juga telah membuat perjanjian dengan ayah...

جمهورية مصر العربيةالمجلس القومي لحقوق الإنسان تفاصيل الوكالة الحكومية البلد مصر  الاسم الكامل المجلس القومي لحقوق الإنسان تأسست 2002 المركز  مصر الإدارة المدير التنفيذي محمد فائق، رئيس المجلس موقع الويب الموقع الرسمي  تعديل مصدري - تعديل   المجلس القومي لحقوق ا�...

 

Wilayah Shikoku 四国WilayahWilayah Shikoku di JepangLuas • Total18.297,78 km2 (7,064,81 sq mi)Populasi (Oktober 1, 2015) • Total3.845.534 • Kepadatan210,2/km2 (544/sq mi)Zona waktuUTC+09:00 Shikoku (四国code: ja is deprecated , harafiah: empat provinsi) adalah pulau terkecil dan yang paling sedikit jumlah penduduknya di antara empat pulau utama Jepang. Daerah Shikoku - yang terdiri dari seluruh pulau Shikoku - meliputi sekitar 1...

 

2024 edition of award ceremony 66th Annual Grammy AwardsDateFebruary 4, 2024LocationCrypto.com ArenaLos Angeles, CaliforniaHosted byTrevor NoahMost awardsPhoebe Bridgers (4)Most nominationsSZA (9)Websitegrammy.comTelevision/radio coverageNetworkCBSParamount+Viewership16.9 million[1] ← 65th · Grammy Awards The 66th Annual Grammy Awards honored the best recordings, compositions, and artists from October 1, 2022, to September 15, 2023, as chosen by the members ...

Rexingencomune Rexingen – Veduta LocalizzazioneStato Francia RegioneGrand Est Dipartimento Basso Reno ArrondissementSaverne CantoneIngwiller TerritorioCoordinate48°54′N 7°11′E / 48.9°N 7.183333°E48.9; 7.183333 (Rexingen)Coordinate: 48°54′N 7°11′E / 48.9°N 7.183333°E48.9; 7.183333 (Rexingen) Superficie2,33 km² Abitanti196[1] (2009) Densità84,12 ab./km² Altre informazioniCod. postale67320 Fuso orarioUTC+1 Codice INS...

 

En 637, le général arabe Khalid ibn al-Walid conquit la Syrie aux Byzantins. Damas devient ensuite la capitale du califat omeyyade. Quand les abbassides prennent le pouvoir, ils installent le califat à Bagdad et nomment des gouverneurs à Damas. Emirs de Damas durant le Califat Rashidûn Khalid ibn al-Walid (635-636) Abu Ubaid (636-637) Amru ben al-As (637-640) Yazid ibn Abu Sufyan (640) Muawiyah ibn Abu Sufyan (640-661) Califes omeyyades de Damas v · m Califes omeyyades de Damas Sou...

 

此條目需要补充更多来源。 (2021年7月4日)请协助補充多方面可靠来源以改善这篇条目,无法查证的内容可能會因為异议提出而被移除。致使用者:请搜索一下条目的标题(来源搜索:美国众议院 — 网页、新闻、书籍、学术、图像),以检查网络上是否存在该主题的更多可靠来源(判定指引)。 美國眾議院 United States House of Representatives第118届美国国会众议院徽章 众议院旗...

First Canadian public railway (opened 1836) Champlain and St. Lawrence RailroadOverviewLocaleQuebec, Canada with a line into New York stateDates of operation1836–1857TechnicalTrack gauge4 ft 8+1⁄2 in (1,435 mm) standard gauge The Champlain and St. Lawrence Railroad (C&SL) was a historic railway in Lower Canada, the first Canadian public railway[1] and one of the first railways built in British North America. Origin A monument marking the location of...

 

العلاقات الإسرائيلية المدغشقرية إسرائيل مدغشقر   إسرائيل   مدغشقر تعديل مصدري - تعديل   العلاقات الإسرائيلية المدغشقرية هي العلاقات الثنائية التي تجمع بين إسرائيل ومدغشقر.[1][2][3][4][5] مقارنة بين البلدين هذه مقارنة عامة ومرجعية للدولتين: وج�...

 

منتخب لاتفيا لهوكي الجليد للناشئين البلد لاتفيا  رمز IIHF LAT مشاركة دولية  لاتفيا 47 – 1 اليونان  (ريغا، لاتفيا؛ 10 نوفمبر 1992) أكبر فوز  لاتفيا 47 – 1 اليونان  (ريغا، لاتفيا؛ 10 نوفمبر 1992) أكبر هزيمة  كندا 16 – 0 لاتفيا  (ساسكاتون، ساسكاتشوان، كندا؛ 26 ديسمبر 2009) بطولة...

伊斯兰合作组织Organisation of Islamic Cooperation(英語)Organisation de la Coopération Islamique(法語)منظمة التعاون الإسلامي(阿拉伯語) 旗帜格言:To safeguard the interests and ensure the progress and well-being of Muslims  成员国  观察国  暂停会籍行政总部 沙地阿拉伯吉达 官方语言阿拉伯语英语法语类型宗教成员国57个在籍成员国(英语:Member states of the Organisation ...

 

Libertarian political migration Free State ProjectFormationSeptember 1, 2001; 22 years ago (2001-09-01)Headquarters373 South Willow St #161, Manchester, New Hampshire, U.S.Websitefsp.org This article is part of a series onLibertarianismin the United States Schools Agorism Anarcho-capitalism Austro Autarchism Bleeding-heart Christian Consequentialist Feminist Fusionism Geo Green Market anarchism Minarchism Natural-rights Neo Paleo Panarchism Paternalist Propertarianism Techno...

 

Several historic buildings in the Unionville Heritage District, one of four heritage conservation districts in Markham. This is a list of historic building in Markham, Ontario, Canada. The earliest structures that were built in Markham, Ontario originated from indigenous settlements in the region, including the Iroquois, the Huron Wendat, the Petun and the Neutral Nation.[1] However, Markham's oldest standing structures dates back to its earliest European settlers, who settled the ar...

2009 documentary film directed by Amy Rice and Alicia Sams By the People: The Election of Barack ObamaDirected byAmy RiceAlicia Sams [ktn]Produced byBristol BaughanDeric MargolisD.J. MartinAudrey RosenbergBenjamin GoldhirshDan O'MearaChris RomanoEdward NortonStuart BlumbergWilliam MiglioreElissa BrownAmy RiceAlicia SamsStarringBarack Obama, variousEdited bySam PollardGeeta GandbhirArielle AmsalemMusic byCraig WedrenDistributed byHBORelease date August 7, 2009 (2009-08-07) Runni...

 

Tanah Laut Peta Zuid en Ooster Afdeeling van Borneo, Distrik Pleihari no. I Distrik Pleihari (district Plaijharie[1] atau Palai-ari) adalah bekas distrik (kawedanan) yang merupakan bagian dari wilayah administratif Onderafdeeling Tanah Laut pada zaman kolonial Hindia Belanda dahulu. Distrik Pleihari pernah dipimpin oleh Kepala Distrik (districhoofd) yaitu Tahun Districtshoofd Panghoeloe 1861 Kiai Aboekoesin[2][3][4][5] - 1868 Kiaij Aboekoesin[6]...

 

German Commander-in-Chief during World War II (1881–1948) Walther von BrauchitschBrauchitsch in 1939Commander-in-Chief of the German ArmyIn office4 February 1938 – 19 December 1941ChancellorAdolf HitlerPreceded byWerner von FritschSucceeded byAdolf Hitler Personal detailsBornWalther Heinrich Alfred Hermann von Brauchitsch(1881-10-04)4 October 1881Berlin, Prussia, German EmpireDied18 October 1948(1948-10-18) (aged 67)Hamburg, British-occupied GermanyResting placeSalzgitterSpo...

2015 local election in England, UK Map of the results The 2015 Walsall Metropolitan Borough Council election took place on 7 May 2015 to elect members of Walsall Metropolitan Borough Council in England.[1] This was on the same day as other local elections. Council make up After the 2015 local election, the political make up of the council was as follows:[2] Party Number of councillors Labour 27 Conservative 25 Liberal Democrats 2 UKIP 3 Independent 3 References ^ Upcoming elec...

 

丁盛荣Joseph-Marie Chauveau巴黎外方傳教會會士前西藏宗座代牧區宗座代牧教區西藏宗座代牧區宗座代牧 (康定教區)就任1864年9月9日卸任1877年12月21日前任杜多明繼任畢天榮聖秩晉鐸於1838年9月22日晉鐸晉牧於1850年9月晉牧個人資料出生1816年2月24日法国盧瓦爾河地區大區旺代省呂松逝世1887年11月7日 (61歲)清朝西藏打箭鑪直隸廳國籍法國籍教派天主教曾任職位雲南代牧區輔理主教 (185...