4. Typen und Datenstrukturen
 
zurück
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:

type KLEINE_ZAHL is range 0..10;
type Andere_Zahl is range -100..100;


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:

type Bezeichner is mod Modulus; -- Modulus ist eine positive ganze Zahl


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:

type Unsigned_Byte is mod 256; -- oder mod 2**8;


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.

type Hash_Index is mod 97; -- Modulus ist eine Primzahl



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.

type Small is range -2**7 .. 2**7-1;
for Small'size use 8;


Die Werte für Small sind:

-128 = 10000000
-127 = 10000001
-126 = 10000010
...    
-3 = 11111101
-2 = 11111110
-1 = 11111111
0 = 00000000
1 = 00000001
2 = 00000010
3 = 00000011
...    
124 = 01111100
125 = 01111101
126 = 01111110
127 = 01111111


type Byte is range 0 .. 2**8-1;
for Byte'size use 8;


Die Werte für Byte sind:

0 = 00000000
1 = 00000001
2 = 00000010
3 = 00000011
4 = 00000100
...    
252 = 11111100
253 = 11111101
254 = 11111110
255 = 11111111

Die Werte für Byte sind leicht nachzuvollziehen. Die Repräsentation für Small nennt man Zweierkomplement.


 
zurück
 Index   Ada Tour - Dokumentation  
© 2003 Förderverein Ada Deutschland e.V.