Datentypen
Der JKCEMU-BASIC-Compiler kennt vier Datentypen:
-
Integer
für ganze Zahlen im Bereich -32767 bis +32767
-
Long
für ganze Zahlen im Bereich -2147483647 bis +2147483647
-
Decimal
für ganze Zahlen und Fließkommazahlen
mit bis zu 11 Dezimalstellen,
davon maximal 7 Nachkommastellen
-
String
für Zeichenketten
Beim numerischen Datentyp Integer werden die Zahlen intern
im 16-Bit-Zweierkomplement gespeichert.
Damit umfasst der Wertebereich auch die Zahl -32768.
Allerdings kann diese Zahl nicht immer errechnet werden,
da deren absoluter Betrag (+32768),
der bei manchen Berechnungen intern gebildet werden muss,
nicht mehr im Wertebereich liegt.
Aus diesem Grund sind bei Integer nur Zahlen
von -32767 bis +32767 voll nutzbar.
Long ist ein numerischer Datentyp,
der ganze Zahlen im 32-Bit-Zweierkomplement speichert.
Adäquat zu Integer gibt es auch bei Long eine Zahl,
die zwar mit zum Wertebereich gehört,
aber nicht voll nutzbar ist: -2147483648.
Dieser Datentyp speichert die Zahlen als gepackte BCD-Zahlen in 6 Bytes
(BCD: Binary Coded Decimal, gepackt: zwei Ziffern pro Byte).
Das oberste Halbbyte enthält das Vorzeichen (1 Bit)
und die Anzahl der Nachkommastellen (3 Bit).
Damit ergeben sich 11 Dezimalstellen,
davon 0 bis 7 Nachkommastellen.
Es lassen sich somit folgende Zahlen speichern:
-99999999999 bis 99999999999 bzw.
-9999999999.9 bis 9999999999.9 bzw.
...
-9999.9999999 bis 9999.9999999
Der kleinste darstellbare Betrag ist: 0.0000001
Während die meisten BASIC-Interpreter und -Compiler
zur Speicherung von Fließkommazahlen auf einen Datentyp
mit reinen Binärerzahlen sowie mit Mantisse und Exponent
zurückgreifen (z.B. Single, Float, Double),
verwendet der JKCEMU-BASIC-Compiler den Datentyp Decimal,
der die Zahlen intern im Dezimalsystem speichert.
Das hat den Vorteil, dass keine Rundungsfehler durch
die Umrechnung zwischen Dezimal- und Binärsystem auftreten.
Dadurch eignet sich der Datentyp auch für mathematisch
exakte Berechnungen
(z.B. für Geldbeträge, wo auch der letzte Cent stimmen muss).
Wenn allerdings das Ergbenis einer Berechnung mehr Stellen hat,
als der Datentyp fassen kann, kommt es entweder
zu einem Überlauf (mehr als 11 Vorkommastellen)
oder die zu vielen Nachkommastellen werden abgeschnitten.
Im ersten Fall bricht das Programm mit einer Fehlermeldung ab,
im zweiten Fall werden die Fehlervariablen
ERR und
ERR$ entsprechend gesetzt.
Man kann somit im Programm mit
IF ERR=E_DIGITS_TRUNCATED THEN ...
abfragen, ob bei den Decimal-Berechnungen in der letzten Anweisung
Nachkommastellen abgeschnitten wurden oder ob das mathematisch
exakte Ergebnis berechnet werden konnte.
An dieser Stelle sollen auch die Nachteile des Datentyps
nicht verschwiegen werden:
-
Im Vergleich zu Fließkommazahlen mit Mantisse und Exponent
ist bei Decimal der Wertebereich,
d.h. der größte darstellbare Betrag, wesentlich kleiner.
-
Durch die Nutzung des BCD-Formats werden für die gleiche
Genauigkeit mehr Bytes benötigt.
-
BCD-Berechnungen dauern länger als vergleichbare
Fließkommaberechnungen mit reinen Binärzahlen.
Der Datentyp String dient zur Speicherung von Zeichenkettem
und wird immer mit einem nachgestellten $-Zeichen markiert,
d.h., alle Variablen und Funktionen, deren Namen auf ein
Dollarzeichen enden, sind String-Variablen bzw. String-Funktionen,
die eine Zeichenkette speichern bzw. liefern.
Weitergehende Informationen finden Sie auf der Seite:
Zeichenkettenverarbeitung
Typumwandlungen
Es gibt implizite und explizite Typumwandlungen.
Implizit bedeutet, dass der Compiler automatisch
die notwendige Typumwandlung vornimmt.
Das geschieht an den Stellen, wo ein numerischer Datentyp
mit einem kleineren Wertebereich an einer Stelle angegeben wurde,
wo ein numerischer Datentyp mit einem größeren Wertebereich
erwartet wird.
Konkret betrifft das
Operatoren mit zwei Operanden
und bestimmte Funktionsargumente.
Die implizite Typumwandlung geht immer vom kleineren
zum größeren Wertebereich, d.h. in diese Richtung:
Integer → Long → Decimal
Bei der expliziten Typumwandlung wird eine BASIC-Funktion verwendet,
die im Quelltext des BASIC-Programms steht,
die also vom Programmierer ausgewählt wurde.
Folgende Funktionen stehen zur Typumwandlung zur Verfügung:
-
CDEC
(Integer, Long → Decimal)
-
CINT
(Decimal, Long → Integer)
-
CLNG
(Decimal, Integer → Long)
-
DECVAL
(String → Decimal)
-
INTVAL
(String → Integer)
-
LNGVAL
(String → Long)
-
VAL
(String → Integer)
Im weiteren Sinn dienen auch diese Funktionen der Typumwandlung:
-
ASC
(String → Integer)
-
BIN$
(Integer, Long → String)
-
CHR$
(Integer → String)
-
HEX$
(Integer, Long → String)
-
OCT$
(Integer, Long → String)
-
STR$
(Decimal, Integer, Long → String)