Siehe auch Zahlendarstellung.
Betrachtet werden hier nur Ganzzahlen. Festkommazahlen erreicht man durch "Denken" und Ausgeben eines Kommas an der richtigen Position. Exponential-Darstellungen wie 1E9 werden nicht betrachtet.
Die folgenden Ausführungen beziehen sich nur auf Assembler, weil es diese Konvertierungsroutinen in jeder C-Bibliothek gibt.
Diese Funktion ist deutlich schwieriger als die gegenteilige Routine atoi, basiert auf dem Hornerschema und benötigt eine Divisionsroutine.
Als Bonbon kann man mit jeder Zahlenbasis (Standard: 10) arbeiten; für Hexadezimalzahlen (16) fester Länge existiert ein stark vereinfachter und schnellerer Algorithmus.
Das Hornerschema besagt, die Zahl durch 10 zu teilen, den Rest von rechts nach links auszugeben und mit dem Quotienten so oft zu wiederholen, bis er Null ist. Weil Zahlen besser von links nach rechts ausgegeben werden (das tun semitische Schriften übrigens auch!!), muss man die in verkehrter Reihenfolge anfallenden Ziffern in einem Kellerspeicher zwischenlagern, am einfachsten auf dem Stack.
8051 | PIC | ||||
---|---|---|---|---|---|
|
Datensenke: itoa schreibt normalerweise in den Speicher. Dies ist für Mikrocontroller oft ein unpraktischer Zwischenschritt, daher sieht man gern ein Umschaltbit vor, welches die anfallenden Zeichen auf die serielle Schnittstelle schreibt.
Vorzeichen: Vorzeichenbehaftete Zahlen werden vor der Ausgabe positiv gemacht (also bedingt negiert) und ggf. ein Minuszeichen vorher ausgegeben.
Führende Nullen: Für führende Nullen wird einfach eine Mindest- Schleifendurchlaufzahl festgelegt.
Rechtsbündige Ausgabe: Dazu sind Leerzeichen am Anfang auszugeben. Oder man gibt die ganze Zahl von rechts nach links aus (nur bei Displays möglich), darf aber das Löschen alter Ziffern nicht vergessen.
Hexadezimalzahlen: Für diesen Fall wird üblicherweise tetradenweise vorgegangen und der sonst so sinnlose DAA-Befehl genial missbraucht:
8051 | PIC | ||||
---|---|---|---|---|---|
|
Komma-Ausgabe: Sie müssen nicht nur beachten, an der richtigen Stelle ein Komma (oder Punkt) auszugeben, sondern auch den Algorithmus verändern, dass die Schleife mindestens [Nachkommastellen+1] Durchläufe macht, um alle erforderlichen Nullen auszugeben. Genauso wie beim Punkt für "führende Nullen".
Typografie: In Deutschland und vielen europäischen Ländern wird das Komma als korrektes Dezimaltrennzeichen angesehen. Auch an Gruppierungszeichen sollte man bei langen Zahlen denken.
Nebenergebnis: itoa liefert zusätzlich:
Eine geeignete Include-Datei für AVR...
Algorithmus: Zunächst wird ein Akkumulator definiert und auf Null gesetzt. Zweckmäßigerweise parst man von der gegebenen Zeichenkette führende Leerzeichen und Tabulatoren weg, im einfachsten Fall alle Zeichen <21h. Dann arbeitet man sich von links nach rechts durch die Ziffern-Zeichenkette und addiert jede Ziffer auf den Akkumulator, der vorher mit der Zahlenbasis (10) multipliziert wird. Mit der ersten Nicht-Ziffer bricht die Schleife ab. Bei Überlauf des Akkumulators sollte die Schleife nicht abbrechen, statt dessen ein Fehler-Bit setzen. Ein weiteres Bit sollte gelöscht werden, wenn eine Ziffer vorgefunden wurde. Je nach erwartetem Zahlenformat sollten Gruppierungszeichen (Punkt oder einzelnes Leerzeichen im deutschen, Komma im englischen) überlesen werden.
8051 | PIC | ||||
---|---|---|---|---|---|
|
Für Hexadezimalzahlen müssen große und kleine Buchstaben in entsprechende Ziffern gewandelt werden. Abgesehen vom 4fachen Linksschieben an Stelle der Multiplikation gibt es keine weiteren Besonderheiten.
Automatische Zahlenbasis: Normalerweise nimmt man dezimale Zahlen an. Erst recht bei Festkomma. Die Vorgabe-Zahlenbasis ist jedoch beliebig. Folgende Präfixe dienen üblicherweise zur Umschaltung:
Datenquelle: atoi liest normalerweise vom Speicher. Dies ist beim Mikrocontroller oft unpraktisch; daher benutzt man gern ein Umschaltbit, welches die Ziffern (meist) von der seriellen Schnittstelle liest.
Vorzeichen: Ein vorangehendes Vorzeichen merkt man sich in einem Bit-Register und negiert am Schleifenende den Akkumulator.
Festkomma: Nach dem Einlesen des Kommas (oder Punktes, oder an der ersten sonstigen Nicht-Ziffer) setzt man die Schleife für [Nachkommastellen] Durchläufe zwangsweise fort und nimmt die Null als gelesene Ziffer an, falls keine weiteren folgen. Überschüssige Nachkommastellen müssen anschließend "weggeparst" werden.
Nebenergebnis: atoi liefert weitere wichtige Nebenergebnisse:
Eine geeignete Include-Datei für AVR...