Übliche Notationen von Zahlen
Zahlen. Computer arbeiten nur mit Zahlen. Genauer gesagt arbeiten sie mit Nullen und Einsen und bauen daraus den Rest zusammen. Daraus ergibt sich, daß man in der Informatik auf ganz andere Weise rechnet als sonstwo - genauer gesagt arbeitet mit anderen Zahlensystemen. (Das Oktalsystem lasse ich mal aus, weil man das eh kaum braucht.)
Das Binärsystem ist das einfachste für die IT relevante Zahlensystem - es besteht aus zwei Zahlen, 0 und 1 - oder, wie ein theoretischer Informatiker schreiben würde: {0, 1} Wenn man Binärzahlen schreibt und darauf hinweisen will, daß es sich um Binärzahlen handelt, setzt man oft ein kleines b oder eine tiefgestellte 2 an das Ende der Zahl. (Bei Dezimalzahlen schreibt man ein kleines d oder eine tiefgestellte 10.)
Ansonsten verhält es sich genau wie unser normales Dezimalsystem; wenn ich N Stellen habe und die alle "voll" (also mit der höchstmöglichen Zahl belegt) sind und ich zähle einen hoch, dann werden alle Zahlen zu Nullen und die Zahl erhält eine weitere Stelle mit dem Wert 1: 111 + 1 = 1000 (7 + 1 = 8)
Jede Stelle hatten einen doppelt so hohen Wert wie die jeweils letzte Stelle. So kann man sich alle Zahlen konstruieren:Im Binärsystem lassen sich einige Operationen ganz einfach durchführen. Beispielsweise kann man eine Zahl mit 2 multiplizieren, indem man sie einen Schritt nach links verschiebt: 100 * 10 = 1000 (4 * 2 = 8)
Das Hexadezimalsystem ist das wohl wichtigste Zahlensystem in der IT. Es hat 16 verschiedene Zahlen: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}
Dieses System wird oft verwendet, weil eine der wichtigsten Einheiten der IT, das Byte, sich aus acht Bits zusammensetzt und damit 256 verschiedene Werte haben kann. Mit zwei Hex-Zahlen kann man 256 Werte darstellen (8 Bit; ine Hex-Zifer kann 4 Bit darstellen). Wenn man Hex-Zahlen schreibt setzt man oft an das Ende ein kleines h oder eine tiefgestellte 16. Durch die gängige Notation in Programmiersprachen wie C hat es sich zudem etabliert, Hexzahlen mit einem "0x" am Anfang zu schreiben. Dadurch, daß man Hexzahlen fast immer verwendet, um Bytes oder Vielfache davon zu beschreiben werden sie sehr häufig zweistellig geschrieben, besonders bei der 0x-Notation.
Ich gebe hier keine Umrechenregeln an, weil das im Kopf nicht so toll geht; ich persönlich setze die Zahl in das Binärsystem um; von da aus geht die Konversion nach Hex leichter. Und die erkläre ich auch nicht, weil alle vernünftigen Menschen für sowas einen Taschenrechner benutzen.
Nebenbei, das mit den Einsen und Nullen ergibt sich daraus, daß eine Leitung im Computer entweder Strom führt oder nicht (oder, um korrekter zu sein: Entweder führt sie viel oder wenig Strom, wobei "wenig" auch 0 sein kann). Das ergibt zwei Werte.
Es gab frühe Computer, die mit anderen Zahlensystemen (beispielsweise dezimal) rechneten, die waren aber zu kompliziert und hatten keine besonders tolle Leistung.
Endigkeit und das LSB
Moment mal. Der Höchstwert eines Byte ist 0xFF und der Höchstwert von zwei Byte ist 0xFFFF. Was ist mit Werten dazwischen? Ist 1024 jetzt 0x0400 oder 0x0004? Man sollte erwarten, daß es 0x0400 ist und das stimmt auch.
Also nehmen wir jetzt unseren x86-kompatiben Rechner, speichern die Zahl ab und merken, daß der Rechner uns widerspricht: Er legt den Kram im Speicher als 0x0004 ab.
¿Qué?
Wir sind gerade in die Endigkeit gelaufen. Der Begriff "Endigkeit" (engl. endianness) bezeichnet, in welcher Reihenfolge zusammengehörige Bytes (also die Bytes, aus denen sich ein größerer Wert zusammensetzt) im Speicher abgelegt werden. Das "Ende" ist das kleinste Byte. Es gibt da drei Mögichkeiten. (Ich verwende zur Illustration mal einen längeren Wert - 0xDEADBEEF, welcher sich darstellen läßt als die Bytefolge 0xDE 0xAD 0xBE 0xEF.)
Großendig (engl. big-endian): Das Byte mit dem höchsten Wert (hier das 0xDE) wird an der niedrigsten Speicheradresse abgelegt (also links) und von da aus gehen wir weiter bis zum niedrigstwertigen Byte, das an der höchsten Adresse liegt.
Dieses System ist für uns am lesbarsten (für den Rechner aber nicht unbedingt, weil er die Zahl von links nach rechts liest).
Kleinendig (engl. little-endian): Das Byte mit dem niedrigsten Wert (hier das 0xEF) wird an der niedrigsten Speicheradresse abgelegt (also links) und von da aus gehen wir weiter bis zum höchstwertigen Byte, das an der höchsten Adresse liegt.
Für uns macht das wenig Sinn, aber der Rechner liest so die niedrigstwertigen Stellen zuerst, was manchmal von Vorteil sein kann.
Mittelendig (engl. middle-endian): Wild durcheinander gewürfelt.
Eklig, eklig, eklig. Dieser Unfug wird heutzutage glücklicherweise nicht mehr betrieben.
Wir haben von den Arabern übernommen, wie die Zahlen geschrieben werden; für uns sind die Zahlen großendig, für Araber hingegen kleinendig (weil bei denen ja die ganze Schrift von rechts nach links geht).
Beim Rechner können die Zahlen auch so oder so verstanden werden; beide Methoden funktionieren. Prozessoren, die großendig arbeiten wären der Motorola 68000 oder die PowerPC-Familie. Kleinendige Prozessoren wären beispielsweise alle zu IA-32 kompatiblen Prozessoren (x86, AMD64). Der Intel Itanium und einige PowerPC-Prozessoren beherrschen beide Endigkeiten (man kann umschalten).
Durch die Endigkeit ergeben sich mitunter Probleme - wenn man eine kleinendig gespeicherte Datei in einem großendigen System liest, ohne sie zu übersetzen, kriegt man Datenmüll. Umgekehrt geau so. Ist klar, es sind ja alle größeren Zahlen verdreht. Dieses Problem wird manchmal als das NUXI- oder XINU-Problem bezeichnet (weil UNIX auf vielen Plattformen läuft und so ziemlich als erstes in dieses Problem gelaufen ist).
Vermeiden kann man diesen Kram nur, indem man bei seinem Datenformat festlegt, welche Endigkeit es hat - und bei allen Implementationen auf Systemen mit der falschen Endigkeit einen Übersetzer einbaut. Man kann natürlich auch die Endigkeit offen lassen und überall Übersetzen eibauen.
Beide Endigkeiten haben ihre eigenen Vor- und Nachteile:
Bei Großendigen Zahlen kann man ganz einfach überprüfen, ob sie positiv oder negativ sind: Man liest das erste Bit, fertig. Außerdem wird dieses Format von TCP/IP und Java verwendet. Kleinendige Zahlen kann man ganz einfach von zwei auf vier Byte verlängern: Man fügt hinten ein 0x0000 an. Großendige Zahlen müßte man zwei Byte nach hinten verlegen. Die Rückumwandlung ist uch einfach: Man verwirft die beiden letzten Bytes, fertig. An der Adresse ändert sich nichts. Außerdem verwenden IA-32-Rechner dieses Format.
Oh, da hätte ich fast das LSB vergessen. Das Least Significant Bit ist einfach das Bit mit dem niedrigsten Wert - das Bit, das die Eins darstellt. Bei kleinendigen Zahlen ist das LSB an der niedrigsten Speicheradresse, bei großendigen Zahlen an der höchsten. Das Gegenstück zum LSB ist das MSB (Most Significant Bit).