kennen:typen
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | kennen:typen [2020-07-27 10:04] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Datentypen ====== | ||
+ | |||
+ | > Das Definieren von allgemein zu gebrauchenden oder auch anwendungsspezifischen Typen ist in der Tat die wichtigste und grundlegendste Aufgabe in C++. | ||
+ | >> | ||
+ | |||
+ | ===== Variablen ===== | ||
+ | ==== Deklaration ==== | ||
+ | Die Deklaration | ||
+ | führt einen Namen ein und ordnet ihm einen Typ zu. | ||
+ | Ein Bezeichner ist erst nach seiner Deklaration benutzbar | ||
+ | (" | ||
+ | Der [[# | ||
+ | bestimmt das Verhalten des Objektes: | ||
+ | welche Speichergröße dem Objekt im Programm zugeordnet wird, | ||
+ | wie diese Bitfolge zu interpretieren ist | ||
+ | und welche [[.: | ||
+ | |||
+ | Durch die Definition | ||
+ | wird dem Objekt ein Speicherplatz (Adresse) zugeordnet. | ||
+ | Jedes Objekt muss im Programm genau einmal definiert sein ("one definition rule" | ||
+ | Für Variablen ist die Deklaration gleichzeitig auch eine Definition, | ||
+ | wenn [[# | ||
+ | nichts anderes angeben. | ||
+ | |||
+ | Syntax: | ||
+ | > Spezifizierer Typ DeklariertesObjekt Initialisierer '';'' | ||
+ | <code cpp> | ||
+ | extern int anzahl; | ||
+ | double x, y, z; | ||
+ | |||
+ | char zeichen = ' | ||
+ | int const GROESSE = 42; | ||
+ | float feld[GROESSE]; | ||
+ | |||
+ | float* zeiger = & | ||
+ | float& anfang = feld[0]; | ||
+ | char* (*zeiger_auf_zeichenkettenfunktion)(char[], | ||
+ | </ | ||
+ | |||
+ | [[# | ||
+ | und [[# | ||
+ | Mehrere Objekte können als (kommagetrennte) Liste deklariert werden. | ||
+ | Durch [[.: | ||
+ | werden [[# | ||
+ | Runde Klammern spielen eine Doppelrolle als Funktionsklammer und zur Vorrangregelung. | ||
+ | |||
+ | Kombinationen der Operatoren können beliebig komplex sein. | ||
+ | Zum Verständnis sollten die Deklarationen von innen nach außen gelesen werden, | ||
+ | d.h. vom neu eingeführten Namen ausgehend entsprechend der | ||
+ | [[.: | ||
+ | Der oben definierte Bezeichner '' | ||
+ | ist ein '' | ||
+ | mit einem '' | ||
+ | und einem '' | ||
+ | Der '' | ||
+ | erhält die Einsprungadresse der Funktion '' | ||
+ | als Anfangswert. Die Typprüfung des Compilers akzeptiert die Zuweisung nur, | ||
+ | weil die Funktion '' | ||
+ | |||
+ | <code cpp> | ||
+ | char* strcat(char*, | ||
+ | </ | ||
+ | deklariert ist (Feldparameter werden als Zeiger behandelt); | ||
+ | Funktionsnamen sind Adressen im Maschinencode, | ||
+ | |||
+ | ==== Geltungsbereich und Lebensdauer ==== | ||
+ | Der Bezeichner ist ab seiner Deklaration bekannt | ||
+ | und darf im folgenden Quelltext benutzt werden. | ||
+ | Erfolgte die Deklaration in einem [[.: | ||
+ | aus geschweiften Klammern '' | ||
+ | ist der Name nur [[.: | ||
+ | Außerhalb von Blöcken deklarierte Bezeichner sind bis zum Ende des Quelltextes | ||
+ | ([[.: | ||
+ | |||
+ | Lokale Bezeichner, dazu zählen auch Funktionsparameter, | ||
+ | sind unabhängig von äußeren Bezeichnern definierbar. | ||
+ | Die lokalen Bezeichner verdecken in ihren Geltungsbereich | ||
+ | gleichnamige Bezeichner außerhalb des Blockes. | ||
+ | |||
+ | Die Lebensdauer und damit der Speicherplatzbedarf globaler Variablen | ||
+ | erstreckt sich über die gesamte Programmlaufzeit (statische Variablen). | ||
+ | |||
+ | Für lokale Variablen wird beim Eintritt in den Block automatisch Speicher | ||
+ | auf dem Stapel reserviert und beim Verlassen des Blockes wieder freigegeben. | ||
+ | Damit geht auch der gespeicherte Wert verloren. | ||
+ | |||
+ | ==== Spezifizierer ==== | ||
+ | [[.: | ||
+ | beeinflussen die Lebensdauer bzw. den Speicherort von Variablen. | ||
+ | |||
+ | * Die Angabe [[.: | ||
+ | * Mit [[.: | ||
+ | * Mit [[.: | ||
+ | * Als [[.: | ||
+ | |||
+ | <code cpp> | ||
+ | int noch_ein_Bier_bitte() | ||
+ | { | ||
+ | static int biere = 0; | ||
+ | return ++biere; | ||
+ | } | ||
+ | </ | ||
+ | Durch [[.: | ||
+ | (unabsichtliches) Ändern des Variablenwertes nach der Initialisierung verbieten. | ||
+ | Der direkte Änderungsversuch erzeugt einen Übersetzungsfehler. | ||
+ | C-Programmierer sagen zu '' | ||
+ | |||
+ | * sie wissen, wie man '' | ||
+ | * der Drang, das zu tun, beliebig groß werden kann und | ||
+ | * der Begriff [[.: | ||
+ | |||
+ | Konstante [[# | ||
+ | müssen nicht unbedingt auf konstante Objekte verweisen. | ||
+ | Sie sind vielmehr eine " | ||
+ | den Wert nicht über diesen Bezeichner zu ändern. | ||
+ | |||
+ | Eine als [[.: | ||
+ | muss bei jeder Auswertung neu aus dem Speicher gelesen werden. | ||
+ | Optimierungsversuche des Compilers werden unterbunden. | ||
+ | Das ist bei Hardwarezugriffen (Ports u.ä.) notwendig, | ||
+ | wenn sich Speicherinhalte "von außerhalb" | ||
+ | <code cpp> | ||
+ | char const volatile far* COM1 = (char far*) 0x3F8; // serial port unter DOS | ||
+ | </ | ||
+ | Eine [[.: | ||
+ | [[.: | ||
+ | [[# | ||
+ | darf auch dann geändert werden, | ||
+ | wenn die umgebende Struktur oder Klasse logisch konstant ist: | ||
+ | |||
+ | <code cpp> | ||
+ | struct Count | ||
+ | { | ||
+ | mutable int counter; | ||
+ | }; | ||
+ | |||
+ | void f(Count const& c) | ||
+ | { | ||
+ | c.counter++; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== Anfangswerte ==== | ||
+ | Variablen können, Zeiger sollten, | ||
+ | Konstanten und Referenzen müssen bei ihrer Definition Werte erhalten. | ||
+ | Neben der [[.: | ||
+ | ist auch die Übergabe von Startwerten in Klammern möglich. | ||
+ | Diese aus [[.: | ||
+ | übernommene Schreibweise ist auch für [[begriffe# | ||
+ | zusammengesetzter Typen üblich. | ||
+ | <code cpp> | ||
+ | int i = 3; // Variablendefinition in " | ||
+ | int j(i); // Variablendefinition in " | ||
+ | // aber: | ||
+ | int f(int i); // Funktionsdeklaration, | ||
+ | </ | ||
+ | Seit C++11 kann die Übergabe von Anfangswerten auch in geschweiften Klammern erfolgen ([[begriffe# | ||
+ | <code cpp> | ||
+ | int k{9}; // ok | ||
+ | int l{9.0}; | ||
+ | int m{9.5}; | ||
+ | </ | ||
+ | Der Typ der Variable erschließt sich aus dem Initialisierungswert, | ||
+ | Bei komplexen Typbezeichnern wie '' | ||
+ | Diese Art der Variablendefinition lässt sich (fast) durchgehend nutzen ([[begriffe# | ||
+ | C++17 erlaubt zudem Zugriff eines Bestandteile eines [[# | ||
+ | <code cpp> | ||
+ | auto n = 3; // int | ||
+ | auto p = std:: | ||
+ | auto [value, success] = p; // C++17 structured bindings, Kopie der Werte | ||
+ | auto& [v, done] = p; // Referenz, Schreiben in die Bestandteile von p möglich | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Typen ===== | ||
+ | C++ ist eine streng typisierte Sprache. Das Typsystem enthält | ||
+ | |||
+ | * vordefinierte fundamentale oder [[# | ||
+ | * [[# | ||
+ | * [[# | ||
+ | * und daraus ableitbarenoder [[# | ||
+ | * [[# | ||
+ | * [[# | ||
+ | * [[# | ||
+ | * [[# | ||
+ | * [[# | ||
+ | * [[# | ||
+ | |||
+ | Mit dem Schlüsselwort [[.: | ||
+ | sind neue Namen für Typen festlegbar. | ||
+ | |||
+ | ===== Grundtypen ===== | ||
+ | ==== Ganzzahlige Typen ==== | ||
+ | <code cpp> | ||
+ | bool | ||
+ | </ | ||
+ | Der Typ [[.: | ||
+ | und [[.: | ||
+ | einen der beiden möglichen Werte [[.: | ||
+ | und [[.: | ||
+ | Der Wert 0 wird als '' | ||
+ | jeder andere Wert (egal welchen Typs) wird zu '' | ||
+ | Umgekehrt wird bei [[# | ||
+ | '' | ||
+ | |||
+ | <code cpp> | ||
+ | char | ||
+ | </ | ||
+ | Zeichen haben den Typ [[.: | ||
+ | Dieser hat meistens 8 bit Breite | ||
+ | und kann damit einen von 256 verschiedenen Werten aufnehmen. | ||
+ | Es existieren verschiedene Standards | ||
+ | (EBCDIC, ASCII, ISO 8859-1, ISO 10646, | ||
+ | Unicode, UCS32, ...), | ||
+ | den einzelnen Zeichen Zahlenwerte zuzuordnen. | ||
+ | Welcher Zeichensatz verwendet wird, | ||
+ | ist maschinen- und betriebssystemabhängig. | ||
+ | Für Zeichensätze wie Unicode existiert ein Datentyp | ||
+ | [[.: | ||
+ | |||
+ | Zeichentypen werden als Ganzzahltypen aufgefasst, | ||
+ | weil mit ihnen auch | ||
+ | [[.: | ||
+ | (mit begrenzten Werteumfang) möglich sind. | ||
+ | Ob ein '' | ||
+ | ([[.: | ||
+ | oder nicht vorzeichenbehaftet ([[.: | ||
+ | behandelt wird, ist compilerabhängig. | ||
+ | Ist der Unterschied wichtig, | ||
+ | können '' | ||
+ | C++17 definiert in [[.: | ||
+ | [[.: | ||
+ | |||
+ | <code cpp> | ||
+ | int unsigned | ||
+ | short unsigned short | ||
+ | long | ||
+ | </ | ||
+ | Der Ganzzahltyp [[.: | ||
+ | nimmt typisch die Verarbeitungsbreite eines Maschinenworts an. | ||
+ | Diese kann mit dem [[.: | ||
+ | ermittelt werden: '' | ||
+ | Der Wertebereich der Ganzzahl | ||
+ | umfasst (Zweierkomplementdarstellung vorausgesetzt) | ||
+ | die Werte '' | ||
+ | |||
+ | Die Modifikationen [[.: | ||
+ | [[.: | ||
+ | größere Breite besitzen. | ||
+ | Typisch sind 16 bit und 32 bit bzw. 64 bit. | ||
+ | Zu jeder '' | ||
+ | gibt es eine '' | ||
+ | deren Wertebereich 0 bis '' | ||
+ | |||
+ | In der Bibliothek [[.: | ||
+ | wenn exakte oder Mindestwerte für Speicherbedarf oder Wertebereich bzw. Verarbeitungsgeschwindigkeit von Bedeutung sind. | ||
+ | |||
+ | Die Bibliothek < | ||
+ | definiert Konstanten mit den Grenzen der Wertebereiche. | ||
+ | Die Schablone '' | ||
+ | aus < | ||
+ | bietet eine einheitliche Schnittstelle für Größeninformationen. | ||
+ | |||
+ | ==== Gleitkommatypen ==== | ||
+ | <code cpp> | ||
+ | float | ||
+ | </ | ||
+ | Fließkomma- oder Gleitkommatypen nehmen gebrochene Zahlen | ||
+ | mit begrenztem Wertebereich und beschränkter Genauigkeit auf. | ||
+ | Typischerweise sind nur 6 führende Ziffern einer | ||
+ | [[.: | ||
+ | Doppelt genaue Zahlen ([[.: | ||
+ | erlauben einige Stellen mehr, | ||
+ | '' | ||
+ | Angaben zum Wertebereich und zur möglichen Genauigkeit | ||
+ | sind aus den Bibliotheken < | ||
+ | [[.: | ||
+ | Der Wertebereich der einfach genauen | ||
+ | ist eine Untermenge der doppelt genauen Gleitkommazahlen. | ||
+ | |||
+ | Nicht jede gebrochene Zahl ist als endlicher Dualbruch darstellbar. | ||
+ | Beim Rechnen mit Gleitkommazahlen kommt es deshalb zu Rundungsfehlern. | ||
+ | Die Auslöschung signifikanter Stellen bei der Differenzbildung | ||
+ | lässt Genauigkeit verloren gehen. | ||
+ | Einige numerische Rechenverfahren reagieren empfindlich | ||
+ | auf geringfügige Änderungen von Startwerten (Instabilität oder Chaos). | ||
+ | |||
+ | > Die Auswahl der richtigen Genauigkeit für ein Problem, bei dem die Auswahl relevant ist, erfordert ein weitgehendes Verständnis von Gleitkommaberechnungen. Falls Sie dieses Wissen nicht haben, holen Sie sich Hilfe, nehmen Sie sich die Zeit zum Lernen oder benutzen Sie '' | ||
+ | >> | ||
+ | |||
+ | ==== Typumwandlung ==== | ||
+ | Werte der Grundtypen sind trotz strenger Typprüfung | ||
+ | nahezu beliebig ineinander umwandelbar. | ||
+ | Führt die Umwandlung zu Genauigkeitsverlust | ||
+ | oder ganz aus dem Wertebereich des Zieltyps hinaus, | ||
+ | kann der Compiler Warnungen ausgeben. | ||
+ | Der Programmierer sollte diese Warnungen ernst nehmen, | ||
+ | da sie zu subtilen Laufzeitproblemen führen können. | ||
+ | Typumwandlungen können automatisch (bei Wertzuweisungen, | ||
+ | Rückgabe von Funktionswerten und in Rechenoperationen) | ||
+ | oder auch ausdrücklich durch einen | ||
+ | [[.: | ||
+ | Die ausdrückliche Konversion schaltet die Compiler-Warnung ab. | ||
+ | <code cpp> | ||
+ | int i = 65; | ||
+ | char c = char(i); | ||
+ | // char d{i}; // C++11 Fehler: narrowing | ||
+ | </ | ||
+ | Passt der Wert eines Ausdrucks in den Wertebereich des Zieltyps, | ||
+ | bleibt der Wert erhalten, auch Vorzeichen werden korrekt behandelt. | ||
+ | Bei der Umwandlung von Gleitkommazahlen in Ganzzahlen wird der | ||
+ | gebrochene Anteil abgeschnitten, | ||
+ | Passt der Wert nicht in den Wertebereich eines Zieltyps, | ||
+ | werden bei ganzzahligen Typen höherwertige Bits weggelassen | ||
+ | (Moduloarithmetik beim [[.: | ||
+ | bei Gleitkommatypen ist das Ergebnis nicht definiert. | ||
+ | Die ab C++11 eingeführte, | ||
+ | |||
+ | ===== Zusammengesetzte Typen ===== | ||
+ | ==== Felder ==== | ||
+ | Wird ein Objekt als '' | ||
+ | so handelt es sich um ein Feld mit der Anzahl typgleicher Elemente. | ||
+ | Die Anzahl der Elemente (Dimension oder Feldgröße) muss eine ganzzahlige Konstante sein. | ||
+ | Die Feldelemente belegen einen zusammenhängenden Speicherbereich. | ||
+ | Der Zugriff auf die Feldelemente '' | ||
+ | erfolgt ohne Bereichsprüfung. | ||
+ | Schreibzugriffe außerhalb der Feldgrenzen haben schwer lokalisierbare, | ||
+ | häufig fatale Folgen. | ||
+ | |||
+ | Mehrdimensionale Felder sind Felder von Feldern. | ||
+ | Sie werden durch mehrere aufeinander folgende eckige Klammern beschrieben. | ||
+ | Zwischen benachbarten Speicherplätzen ändert sich der rechteste | ||
+ | (innerste) Feldindex am schnellsten (" | ||
+ | |||
+ | Felder können mit Anfangswerten belegt werden: | ||
+ | |||
+ | <code cpp> | ||
+ | int rechteck[2][3] = { {1, 2, 3}, {4, 5, 6} }; | ||
+ | </ | ||
+ | Die inneren geschweiften Klammern können bei der Initialisierungsliste weggelassen werden. | ||
+ | Auch eine unvollständige Initialisierung ist möglich: | ||
+ | |||
+ | <code cpp> | ||
+ | int primzahlen[100] = { 2, 3 }; // weitere werden später berechnet | ||
+ | int y[2][3] = { 1, 2, 3 }; // nur Zeile y[0][j] belegt | ||
+ | int z[2][3] = { {1}, {4} }; // nur Spalte z[i][0] belegt | ||
+ | </ | ||
+ | Fehlt die äußerste, am weitesten links stehende Felddimension, | ||
+ | wird sie vom Compiler aus der Anzahl der Elemente in der Initialisiererliste bestimmt. | ||
+ | [[.: | ||
+ | benötigen ebenfalls die äußerste Dimensionsangabe nicht, | ||
+ | da Feldparameter als [[#Zeiger]] | ||
+ | auf den Feldanfang behandelt werden. | ||
+ | Weitere Dimensionen müssen jedoch angegeben sein. | ||
+ | |||
+ | ==== Zeiger ==== | ||
+ | Ein Zeiger (engl. pointer) enthält die Adresse eines Objektes im Hauptspeicher. | ||
+ | Die Deklaration '' | ||
+ | |||
+ | - '' | ||
+ | - Der Ausdruck '' | ||
+ | Der [[.: | ||
+ | auf den Wert im Hauptspeicher, | ||
+ | |||
+ | Wird ein Zeiger in der Form '' | ||
+ | muss er vorher eine gültige Speicheradresse erhalten haben | ||
+ | (z.B. über den [[.: | ||
+ | Nicht initialisierte " | ||
+ | Nichtgenutzte Zeiger sollten auf '' | ||
+ | Vor dem Zugriff auf den Inhalt kann dann geprüft werden, | ||
+ | ob der Zeiger auf etwas zeigt: | ||
+ | |||
+ | <code cpp> | ||
+ | int i; | ||
+ | int *ip = &i; // Zeiger ip erhält Adresse von i (ip zeigt auf i) | ||
+ | |||
+ | if (ip) // ip sollte gültig sein, | ||
+ | { | ||
+ | *ip = 10; // ehe über ip der Wert von i angesprochen wird | ||
+ | } | ||
+ | ip = NULL; // ip wird nicht mehr genutzt | ||
+ | </ | ||
+ | |||
+ | ==== Referenzen ==== | ||
+ | Referenzvariablen '' | ||
+ | die für ihre Lebensdauer fest | ||
+ | mit der Speicheradresse einer anderen Variable verbunden sind. | ||
+ | Referenzvariablen werden relativ selten " | ||
+ | um mehrfache umständliche Ausdrücke zu vermeiden. | ||
+ | |||
+ | <code cpp> | ||
+ | int matrix[3][3]; | ||
+ | int &mitte = matrix[1][1]; | ||
+ | mitte = 15; // statt matrix[1][1] = 15; | ||
+ | </ | ||
+ | Häufiger werden sie als | ||
+ | [[.: | ||
+ | |||
+ | [[begriffe# | ||
+ | ==== Aufzählungen ==== | ||
+ | Aufzählungen (engl. enumerations) | ||
+ | sind Sammlungen benannter ganzzahliger (int-)Konstanten, | ||
+ | denen ein gemeinsamer Typname zugeordnet werden kann. | ||
+ | Die Konstanten werden mit 0 beginnend aufsteigend nummeriert, | ||
+ | falls ihnen kein anderer Wert zugeordnet wird. | ||
+ | |||
+ | Werte vom Aufzählungstyp lassen sich problemlos einer '' | ||
+ | umgekehrt jedoch nicht (explizite Typumwandlung erforderlich). | ||
+ | |||
+ | Syntax: | ||
+ | > '' | ||
+ | <code cpp> | ||
+ | enum Woche { SO, MO, DI, MI, DO, FR, SA }; | ||
+ | enum Muenzen { PFENNIG=1, FUENFER=5, GROSCHEN=10, | ||
+ | </ | ||
+ | Typsichere Aufzählungen erlauben keine implizite Umwandlung in Ganzzahlen: | ||
+ | <code cpp> | ||
+ | enum class TriState : char { unknown, no, yes }; | ||
+ | TriState s = TriState:: | ||
+ | // char c = s; // nicht erlaubt | ||
+ | char c = char(s); // ok | ||
+ | </ | ||
+ | Die Angabe eines Grundwertebereichs ist möglich. (Das ist keine [[klassen# | ||
+ | ==== Klassen und Strukturen ==== | ||
+ | Vorwärtsdeklarationen können benutzt werden, | ||
+ | solange der Compiler keine Information über den Strukturinhalt benötigt, | ||
+ | z.B. um einen Zeiger oder eine Referenz zu deklarieren | ||
+ | (unvollständige Typdefinition). | ||
+ | |||
+ | Syntax: | ||
+ | > '' | ||
+ | |||
+ | Inhaltlich zusammengehörende Daten auch verschiedener Typen | ||
+ | ([[.: | ||
+ | und zugehörige Funktionen | ||
+ | ([[.: | ||
+ | lassen sich als Komponenten einer | ||
+ | Struktur (Schlüsselwort [[.: | ||
+ | oder Klasse (Schlüsselwort [[.: | ||
+ | zusammenfassen, | ||
+ | siehe auch [[.: | ||
+ | |||
+ | Die Instanzen werden bei Zuweisung, | ||
+ | Parameterübergabe und Funktionsrückgabe als Einheit behandelt, | ||
+ | d.h. Byte für Byte kopiert. | ||
+ | |||
+ | Syntax: | ||
+ | > '' | ||
+ | > '' | ||
+ | >> | ||
+ | >> | ||
+ | > '' | ||
+ | |||
+ | Der Zugriff auf die Bestandteile einer Instanz | ||
+ | erfolgt als '' | ||
+ | [[.: | ||
+ | legen fest, von wo aus der Zugriff auf die folgenden Komponenten erlaubt ist. | ||
+ | Ohne Zugriffsspezifikation, | ||
+ | sind die Komponenten einer Struktur öffentlich | ||
+ | ([[.: | ||
+ | die einer Klasse nur den Methoden der Klasse zugänglich | ||
+ | ([[.: | ||
+ | Abgesehen davon sind '' | ||
+ | |||
+ | Besitzt die Struktur keine selbstdefinierten | ||
+ | [[.: | ||
+ | können die Variablen Anfangswerte durch eine Initialisiererliste in geschweiften Klammern erhalten. | ||
+ | |||
+ | <code cpp> | ||
+ | struct Atom | ||
+ | { | ||
+ | char symbol[3]; | ||
+ | float masse; | ||
+ | }; | ||
+ | |||
+ | Atom const wasserstoff = { " | ||
+ | Atom atom1, atom2; | ||
+ | atom2 = atom1 = wasserstoff; | ||
+ | |||
+ | float masse = atom1.masse + atom2.masse; | ||
+ | </ | ||
+ | |||
+ | ==== Vereinigungen und Bitfelder ==== | ||
+ | Vereinigungen (Schlüsselwort [[.: | ||
+ | überlagern einem Speicherbereich mehrere Bezeichner. | ||
+ | Das Konzept entspricht den varianten Records | ||
+ | in [[.: | ||
+ | oder '' | ||
+ | Je nach Typ der Komponente werden die gleichen Bits unterschiedlich interpretiert. | ||
+ | Der Speicherbedarf der Vereinigung entspricht dem größten enthaltenen Typ. | ||
+ | Die Nutzung zur Typkonversion ist gefährlich, | ||
+ | |||
+ | Syntax: | ||
+ | > '' | ||
+ | > '' | ||
+ | >> | ||
+ | > '' | ||
+ | |||
+ | Mit Bitfeldern können kleine Informationseinheiten in ein Maschinenwort gepackt werden. | ||
+ | Hinter jeder Komponente wird die Anzahl der zu reservierenden Bits angegeben. | ||
+ | Die Bitfeldkomponenten verhalten sich wie kleine Ganzzahlen mit oder ohne Vorzeichen. | ||
+ | Für Zwischenräume können unbenannte Bitfeldkomponenten eingeschoben werden. | ||
+ | Fast alles an Bitfeldern ist implementierungsabhängig ([[.: | ||
+ | |||
+ | <code cpp> | ||
+ | struct IEEE754Single | ||
+ | { | ||
+ | unsigned mantisse : 23; | ||
+ | unsigned exponent : 8; | ||
+ | unsigned sign : 1; | ||
+ | } bits; | ||
+ | </ | ||
kennen/typen.txt · Zuletzt geändert: 2020-07-27 10:04 von 127.0.0.1