Maximal- und Minimalwerte

Die in die Sprachen C und C++ eingebauten Basistypen weisen unterschiedliche Bitweiten auf und können dementsprechend einen mehr oder weniger grossen Zahlenbereich abdecken. Die im aktuell verwendeten Compiler verfügbaren Minimal- und Maximalwerte der Basistypen sind als Konstanten definiert, welche für Ganzzahltypen in der limits-Bibliothek und für Fliesskommatypen in der float-Bibliothek aufgelistet sind.

Ganzzahltypen

C
C++
#include <limits.h>
#include <climits>

Mithilfe der in der limits-Bibliothek definierten Makros kann der Wertebereich des verwendeten Compilers für die Typen char, short, int und long long abgefragt werden. Folgendes Beispielprogramm soll zur Auflistung der Makros genügen:





-128
 127
 255
-32768
 32767
 65535
-2147483648
 2147483647
 4294967295
-9223372036854775808
 9223372036854775807
 18446744073709551615
#include <stdio.h>
#include <limits.h>

int main(){
  printf("%hhi\n",  SCHAR_MIN);
  printf(" %hhi\n", SCHAR_MAX);
  printf(" %hhu\n", UCHAR_MAX);
  printf("%hi\n",   SHRT_MIN);
  printf(" %hi\n",  SHRT_MAX);
  printf(" %hu\n",  USHRT_MAX);
  printf("%i\n",    INT_MIN);
  printf(" %i\n",   INT_MAX);
  printf(" %u\n",   UINT_MAX);
  printf("%lli\n",  LLONG_MIN);
  printf(" %lli\n", LLONG_MAX);
  printf(" %llu\n", ULLONG_MAX);
  return 0;
}

Es ist zu beachten, dass keine Makros für den Minimalwert eines unsigned-Typs existieren. Dieser ist in jedem Fall 0 (Null).

Es ist desweiteren zu beachten, dass je nach System die ausgegebenen Werte durchaus unterschiedlich sein mögen, oder aber gewisse Makros gar nicht definiert sind. Die auf dieser Seite angegebenen Werte sind diejenigen, welche auf dem System des Autors ausgegeben wurden.

In der limits-Bibliothek befinden sich zudem noch ein paar weitere Makros, welche jedoch für die alltägliche Programmierung kaum relevant sind. Sie sind in der folgenden Tabelle zusammen mit den beim Autor definierten Werten aufgelistet, allerdings wird auf dieser Seite nicht weiter darauf eingegangen. Der Interessierte Leser möge die Bedeutungen in der limits-Bibliothek oder in anderen Quellen nachlesen.

CHAR_BIT8Anzahl Bits in einem char
MB_LEN_MAX6Maximale Anzahl Bytes eines Multi-Byte-Zeichens
CHAR_MIN-128Minimaler Wert eines char ohne signed- oder unsigned-Angabe
CHAR_MAX127Maximaler Wert eines char ohne signed- oder unsigned-Angabe
LONG_MIN-2147483648Minimaler Wert eines signed long
LONG_MAX2147483647Maximaler Wert eines signed long
ULONG_MAX4294967295Maximaler Wert eines unsigned long

Des weiteren definieren gewisse Implementationen noch zusätzliche Makros, welche jedoch weniger neue Funktionalität einführen, denn einfach die bestehende mit neuen Symbolen zu belegen.

LONG_LONG_MINDasselbe wie LLONG_MIN
LONG_LONG_MAXDasselbe wie LLONG_MAX
ULONG_LONG_MAXDasselbe wie ULLONG_MAX

Fliesskommatypen

C
C++
#include <float.h>
#include <cfloat>

Für die drei Typen float, double und long double existieren jeweils Makros, welche den Minimal und Maximal darstellbaren Wert beschreiben. Hierbei handelt es sich jedoch beim Minimum nicht wie bei den Ganzzahlen um einen negativen Wert, sondern um den kleinsten Wert, der grösser ist als Null. Fliesskommazahlen besitzen stets ein Vorzeichen-Bit, womit die durch die Makros beschriebenen Werte somit auch für negative Werte verwendet werden können.





1.175494e-38
3.402823e+38
2.225074e-308
1.797693e+308
3.362103e-4932
1.189731e+4932
#include <stdio.h>
#include <float.h>

int main(){
  printf("%e\n",  FLT_MIN);
  printf("%e\n",  FLT_MAX);
  printf("%le\n", DBL_MIN);
  printf("%le\n", DBL_MAX);
  printf("%Le\n", LDBL_MIN);
  printf("%Le\n", LDBL_MAX);
  return 0;
}

Auch hier ist zu beachten, dass je nach System die ausgegebenen Werte unterschiedlich sein können. Die auf dieser Seite angegebenen Werte sind diejenigen, welche auf dem System des Autors ausgegeben wurden.

In der float-Bibliothek befinden sich noch weitere Makros mit Konstanten zu Basis, Mantisse, Exponent, Maschinenepsilon sowie Anzahl signifikanter Ziffern aller drei Fliesskommatypen. Aufgrund der komplexen Thematik der Fliesskomma-Arithmetik werden auf dieser Seite diese Makros jedoch nur mit den beim Autor definierten Werten in der folgenden Tabelle aufgelistet, jedoch nicht weiter darauf eingegangen. Für weiterführende Informationen wird auf ein Studium der float-Bibliothek sowie andere Quellen verwiesen.

FLT_RADIX2Die Basis der Exponentialdarstellung
FLT_ROUNDS1Rundungs-Methode
FLT_EVAL_METHOD0Fliesskomma-Auswertungsmethode
DECIMAL_DIG21Maximale Anzahl Rundungs-genaue Dezimal-Stellen
FLT_MANT_DIG24Anzahl Radix-Ziffern der Mantisse für float
DBL_MANT_DIG53Anzahl Radix-Ziffern der Mantisse für double
LDBL_MANT_DIG64Anzahl Radix-Ziffern der Mantisse für long double
FLT_DIG6Anzahl genauer Dezimalstellen für float
DBL_DIG15Anzahl genauer Dezimalstellen für double
LDBL_DIG18Anzahl genauer Dezimalstellen für long double
FLT_MIN_EXP-125Minimaler Radix-Exponent für normalisierten float
DBL_MIN_EXP-1021Minimaler Radix-Exponent für normalisierten double
LDBL_MIN_EXP-16381Minimaler Radix-Exponent für normalisierten long double
FLT_MIN_10_EXP-37Minimaler Dezimal-Exponent für normalisierten float
DBL_MIN_10_EXP-307Minimaler Dezimal-Exponent für normalisierten double
LDBL_MIN_10_EXP-4931Minimaler Dezimal-Exponent für normalisierten long double
FLT_MAX_EXP128Maximaler Radix-Exponent für normalisierten float
DBL_MAX_EXP1024Maximaler Radix-Exponent für normalisierten double
LDBL_MAX_EXP16384Maximaler Radix-Exponent für normalisierten long double
FLT_MAX_10_EXP38Maximaler Dezimal-Exponent für normalisierten float
DBL_MAX_10_EXP308Maximaler Dezimal-Exponent für normalisierten double
LDBL_MAX_10_EXP4932Maximaler Dezimal-Exponent für normalisierten long double
FLT_EPSILON1.192093e-07Maschinen-Epsilon für float
DBL_EPSILON2.220446e-16Maschinen-Epsilon für double
LDBL_EPSILON1.084202e-19Maschinen-Epsilon für long double