4. Typen und Datenstrukturen | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
4.3.1.2 Ganzzahlige Typen
Ganzzahlige Typen dienen der Darstellung ganzzahliger Werte. Bei der Definition eines ganzzahligen Typs (integer_type_definition <BNF>) unterscheidet man einen vorzeichenbehafteten und einen nicht vorzeichenbehafteten (auch modularen) ganzzahligen Typ. Syntax zur Definition eines vorzeichenbehafteten ganzahligen Datentypss:
Dabei ist zu beachten, daß beide Typen nicht kompatibel sind und bei Notwendigkeit explizit konvertiert werden müssen. Die gilt auch wenn die Wertebereich identisch sind. Ein modularer Typ ist ein ganzzahliger Typ, bei dem alle arithmetischen Operationen modulo eines spezifischen positiven Modulus ausgeführt werden. Solch ein Typ entspricht einem vorzeichenlosen ganzzahligen Typ ("unsigned type") mit "Umklappsemantik". Syntax zur Definition eines modularen Typs:
Der Wertebereich eines modularen ganzzahligen Typs stellt die Werte von 0..Modulus-1 zur Verfügung. Die modularen Typen sind also vorzeichenlose ganzzahlige Typen, mit denen eine zyklische Arithmetik möglich ist. (Sie entsprechen damit den "unsigned types" einiger anderer Sprachen wie z. B. C). Solche Typen werden häufig in Anwendungen benötigt, und viele Übersetzerhersteller haben daher für Ada 83 ihre eigenen Lösungen mitgeliefert. Deshalb werden solche Typen nun in Ada 95 angeboten, um in Zukunft in dieser Hinsicht portabel programmieren zu können. Als ein Beispiel für 8-Bit-Arithmetik (Byte-Arithmetik) wird der folgende Typ deklariert:
Dann ist der Bereich von Werten, die von Unsigned_Byte unterstützt werden, 0 .. 255. Die Bitrepräsentationen der 256 darstellbaren Zahlen entsprechen denen des Typs "Byte" aus dem letzten Abschnitt. Die normalen arithmetischen Operationen können darauf angewendet werden, aber die ganze Arithmetik wird modulo 256 ausgeführt, d. h. es kann kein "Overflow" auftreten und damit auch kein Constraint_Error ausgelöst werden. Der Modulus eines modularen Typs muß keine Zweierpotenz sein. Zur Implementierung von Hash-Tabellen wird es eine Primzahl sein.
Vordefinierte Operationen Typen mit Vorzeichen Die vordefinierten Operatoren für Objekte eines vorzeichenbehafteten ganzzahligen Typs sind: "+", "-" (unär und binär), "*", "/", "mod" und "rem". Modulare Typen Für modulare Typen sind dieselben Operatoren vordefiniert. Zusätzlich werden die bitweise arbeitenden logischen Operatoren "and", "or", "xor" und "not" angeboten. Die binären Operationen behandeln dabei die Werte als Bitfelder, die Operation "Not" subtrahiert den Wert von der Binärdarstellung des Maximums, das bei der Vereinbarung des modularen Typs angegeben wurde. Die normalen arithmetischen Operationen können angewendet werden, aber die ganze Arithmetik wird modulo 256 ausgeführt, d. h. es kann kein "Overflow" auftreten und damit auch kein Constraint_Error ausgelöst werden. Es gibt keine Probleme, die logischen Operationen mit arithmetischen Operationen zu verknüpfen, weil keine negativen Werte vorhanden sind. Das Paket "Interfaces" (Ada 95 LRM - Annex B: Interface to Other Languages) definiert modulare Typen für jeden vordefinierten ganzzahligen Typ mit Vorzeichen. Die Namen sind z. B. "Unsigned_16" oder "Unsigned_32". Für diese modularen Typen (die als Modulus eine Zweierpotenz haben) werden Operationen für das bitweise Verschieben (shift) und Rotieren (rotate) angeboten. Es ist ein wichtiges Prinzip, daß die Umwandlung zwischen numerischen Typen den Wert nicht verändern soll (außer bei Rundungsfunktionen). Typumwandlungen zwischen modularen Typen oder solchen mit Vorzeichen sind in beide Richtungen möglich, vorausgesetzt, der Wert liegt im Bereich des Zieltyps, ansonsten wird Constraint_Error ausgelöst. Generell sind alle Attribute, die auf diskrete Datentypen anwendbar sind, für die ganzzahligen Typen gültig. Die folgenden Attribute sind für alle ganzzahligen Typen S definiert: S'Address, S'Size, S'Base, S'Width, S'First, S'Last, S'Pred, S'Succ, S'Pos, S'Val, S'Image, S'Value. Das folgende Attribut ist zusätzlich für alle modularen Typen S definiert: S'Modulus. Auf modulare Typen angewendet, gibt es deren Modulus zurück. Dies ist bei generischen Parametern von besonderem Wert. Z. B. gilt Unsigned_Byte'Modulus = 256. Darstellung ganzahliger Typen Für die folgenden Typen soll die Bitrepräsentation der darstellbaren Werte angegeben werden.
Die Werte für Small sind:
Die Werte für Byte sind:
Die Werte für Byte sind leicht nachzuvollziehen. Die Repräsentation für Small nennt man Zweierkomplement. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|