Einführung in Typen in C++ im Rahmen der Lehre der C++-Programmierung. (Typen in C++), Lektion, Seite 722233
https://www.purl.org/stefan_ram/pub/c++_gleitkommazahlen (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
C++-Kurs

Typen in C++ 

Wir haben bisher schon verschiedene Literale, wie »65«, »12.82« oder »"Alpha"s« kennengelernt. Diese gehören offensichtlich verschiedenen Typen  an: Das erste Literal steht für eine Zahl ohne  Nachkommastellen, das zweite für eine Zahl mit  Nachkommastellen und das dritte ist gar keine Zahl, sondern ein Text. Tatsächlich ordnet man solchen Literalen in C++  verschiedene sogenannte Typen  zu (die man auch Datentypen  nennt). Beispielsweise hat das Literal »65« den Typ ›int‹, und das Literal »12.82« den Typ ›double‹.

Jedem Literal wird durch Regeln der Programmiersprache ein bestimmter Typ  zugeordnet. Der Typ eines Literals legt fest, an welchen Stellen eines Programmes das Literal verwendet werden kann, und was diese Verwendung dann bedeutet.

int

Ein Numerale ohne Punkt ».« aus dem Bereich von 0 bis 32767 hat den Typ ›int‹.

Der Datentyp ›int‹ wird auch als ganzzahliger Typ  bezeichnet, da seine Zahlen ganzzahlig sind, also keine Nachkommastellen haben.

Ein Numerale vom Datentyp ›int‹ ist ein ganzzahliges Numerale.

Falls der zulässige Bereich eines int -Literals (welcher von der C++ -Implementation festgelegt wird) verlassen wird, so kann der Wert des Literals nicht mehr sicher vorhergesagt werden. Da alle Implementationen jedoch mindestens Werte zwischen -32767 und 32767 unterstützen müssen, kann man sich darauf verlassen, daß int -Werte aus diesem Bereich verwendet werden können.

int‹ ist nicht “integer 

Die richtige Aussprache des Typs ›int‹ umfaßt nur eine Silbe und endet mit einem /t/: /ɪnt/ (wie das Ende der Aussprache des Wortes “print ”).

int‹ ist in C++ keine  Abkürzung für “integer ”, sondern ein vollständiges Wort! Es wird nach einer Umfrage auch von voll ausgebildeten Programmierern, die englische Muttersprachler sind, als /ɪnt/ ausgesprochen.

Ein Unterschied zwischen den Werten des Datentyps ›int‹ und den Werten, die im Englischen “integers ” genannt werden, besteht auch darin, daß der Datentyp ›int‹ einen größten Wert kennt (oft zirka 2 Milliarden), während ganze Zahlen (englisch “integers ”) beliebig groß sein können.

Es gibt in C  neben dem Typ ›int‹ auch noch andere ganzzahlige  Datentypen, die man dann mit demselben Recht “integer ” nennen könnte.

Auch der Wert des Literals »1.0« ist ganzzahlig, da er keine Nachkommastellen hat, also auf englisch “integer ”, aber sein Typ ist nicht ›int‹.

Es wäre auch möglich, in C++  einen Typ namens ›integer‹ zu definieren. Würde man auch »int« als “integer ” aussprechen, so könnte dies dann mit dem Typ verwechselt werden, der tatsächlich »integer« heißt.

Sprechen Sie genau : Sagen Sie nicht integer ” für »int« oder “int ” für »integer«!

Die C++ -Spezifikation verwendet auch das Wort “integer ”, es hat aber eine andere Bedeutung als »int«!

Zitat
“A program is ill-formed if one of its translation units contains an integer literal that cannot be represented by any of the allowed types.”, C++ 2016, 2.13.2p3

double

Ein Numerale mit Punkt ».« hat den Typ ›double‹.

(“The type of a floating literal is double unless explicitly specified by a suffix.” — N3797 2.14.4p1)

Dieser Typ ist im allgemeinen der Typ von Literalen mit Nachkommastellen, jedoch wird dieser Typ einem Literal auch dann zugewiesen, wenn das Literal gar keine richtigen Nachkommastellen hat, wie bei »2.0«, da es einfacher ist, das formale Kriterium heranzuziehen, welches am Anfang dieses Abschnitts genannt wurde.

Der Datentyp ›double‹ wird auch als Gleitkommatyp  bezeichnet, da seine Zahlen intern normalerweise in einer sogenannten „Gleitkommadarstellung“ abgespeichert werden, die hier aber nicht weiter erklärt werden soll.

Ein Numerale vom Datentyp ›double‹ ist ein Gleitkommanumerale.

Bei Gleitkommazahlen sind kleine Abweichungen von den Literalwerten in den hinteren Stellen gestattet, wie etwa das folgende Beispiel zeigt.

main.cpp

#include <iostream>
#include <ostream>
#include <string>

using namespace ::std::literals;

int main() { ::std::cout << 1.999999 << "\n"s; }

::std::cout
2

Dies zeigt erneut deutlich den Unterschied zwischen einem Numerale und seinem Wert. (Der Wert wurde hier allerdings zur Ausgabe gerundet, so daß die Ausgabe nicht den internen Wert zeigt. Jedoch wird auch der interne Wert unter Umständen gerundet, so daß der von der Rundung der Ausgabe vermittelte Eindruck insgesamt zutrifft, auch wenn die Rundung des internen Wertes an anderer Stelle – weiter hinten – stattfinden kann.)

Beschränkung der Stellenzahl

Werte des Typs ›double‹ können größer als Werte des Typs ›int‹ sein, dafür sind sie aber in den hinteren Stelle ungenau. Wie viele Stellen genau dargestellt werden können, hängt von der C++ -Implementation ab, aber es sind mindestens zirka 10 Stellen. Durch die Rundung auf sechs Stellen bei der Ausgabe kann der Eindruck entstehen, daß es weniger Stellen sind.

main.cpp

#include <iostream>
#include <ostream>
#include <string>

using namespace ::std::literals;

int main() { ::std::cout << 9223372036854775808. << "\n"s; }

::std::cout
9.22337e+018

»9.2237e+018« bedeutet „9,2237 mal 10 hoch 18“, also 9223700000000000000. 2E3 bedeutet „2·10³“, es bedeutet nicht  2³.

double-Werte sind in den hinteren Stellen manchmal ungenau. Daher sollten sie für prinzipiell ungenaue Werte verwendet werden, wie beispielsweise Meßwerte kontinuierlicher Größen (wie Länge, Geschwindigkeiten oder Temperaturen) Für Werte, deren Nachkommastellen genau  bestimmt sein sollen, wie beispielsweise Währungsbeträge, sind sie nicht gedacht. Den Währungsbetrag von „1,68 Euro“ kann man daher besser als ganzzahligen Wert „168 Cents“ mit dem Datentyp »double« abspeichern, jedoch kann es hier auch Probleme geben, falls der Betrag zu groß wird. Es gibt Techniken, welche auch die genaue Darstellung großer Währungsbeträge gestatten, die aber an dieser Stelle des Kurses noch nicht behandelt wurden.

E-Numeralia

In einem Numerale steht »E« für „mal Zehn hoch“. »2E3« bedeutet also beispielsweise ‹ 2 × 10³ ›.

‹ 10³ › bezeichnet den Wert, den man erhält, wenn man die Zahl Eins drei Mal mit 10 multipliziert. Allgemein bezeichnet für eine natürliche Zahl n  der Term ‹ 10  › den Wert, den man erhält, wenn man die Zahl Eins n  Mal mit 10 multipliziert.

Dies bedeutet, daß das Dezimalkomma bei »2.0« um drei Schritte nach rechts verschoben werden soll. Man erhält so »2000.0«.

»2E3« bedeutet also nicht  etwa „2³“, also die Zahl, welche man erhält indem man die Zahl Eins dreimal mit der Zahl 2 multipliziert (also 8).

main.cpp

#include <iostream>
#include <ostream>
#include <string>

using namespace ::std::literals;

int main() { ::std::cout << 2E3 << "\n"s; }

::std::cout
2000

Ein solches E-Numerale hat den Datentyp »double«, selbst wenn es keinen  Punkt enthält.

Wir verzichten an dieser Stelle auf eine ausführliche Darstellung des Aufbaus von E-Numeralia, da E-Numeralia im weiteren Verlauf dieses Kurses nur selten als Teile des Quelltextes vorkommen. Zahlenwerte werden von Programmen zwar manchmal in der E-Schreibweise ausgegeben, aber um diese zu verstehen, reicht die obenstehende Erklärung bereits aus.

::std::string

Ein Zeichenfolgenliteral, wie »"Alpha"s«, hat den Typ ›::std::string‹.

main.cpp

#include <iostream>
#include <ostream>
#include <string>

using namespace ::std::literals;

int main() { ::std::cout << "Alpha"s << "\n"s; }

::std::cout
Alpha

Man kann ›::std::string‹ in der Regel wie “string ” aussprechen, wenn dadurch keine Mißverständnisse zu befürchten sind.

char *

Der Autor dieses Kurses spricht »char *« als “char pointer ” /kɑɚ ˈpɔɪntɚ/ aus, andere sagen “char star ” /kɑɚ stɑɚ/, das Wort »char« wird von vielen aber auch als /tʃɑɚ/ gesprochen.

Ein Zeichenfolgenliteral ohne »s« am Ende, wie »"Alpha"« hat den Typ ›char *‹. Dieser Typ stammt aus der Programmiersprache C . Der Typ ›::std::string‹ ist einfacher zu verwenden, wenn bestimmte Textverarbeitungsarten in C++  benötigt werden. Falls diese nicht  benötigt werden, so spricht nichts dagegen, die C -Strings ohne »s« am Ende zu verwenden. In diesem Kurs werden aber bevorzugt die C++ -Zeichenfolgenliterale mit einem »s« am Ende verwendet, da es einfacher ist, sich auf eine Art von Zeichenfolgen zu beschränken, als zwei verschiedene Arten zu verwenden. So kann auch die Zeit für das Erlernen von Details der Handhabung der C -Strings ohne »s« am Ende gespart werde.

main.cpp

#include <iostream>
#include <ostream>

int main() { ::std::cout << "Alpha" << "\n"; }

::std::cout
Alpha

char *‹ ist nicht ›char

char‹ ist ein ganz anderer Datentyp als ›char *‹! Deswegen darf ›char *‹ nicht einfach nur wie ›char‹ ausgesprochen werden!

Typen im Quelltext

Bis auf weiteres schreiben wir Typen nicht  in Programme. Sie dienen uns lediglich zur Beschreibung  von Programmteilen.

Übungen

Welche Typen haben die folgenden Literale jeweils?

  • 1
  • 1.2
  • "2"s
  • 1E2

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram722233 stefan_ram:722233 Typen in C++ Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd722233, slrprddef722233, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/c++_gleitkommazahlen