// Programm: convert.C
// Beispiele fuer implizite und explizite Konversion
// von elementaren Zahlentypen
#include
#include
#include
int main()
{
const int imax = std::numeric_limits::max();
const unsigned int umax = std::numeric_limits::max();
const float fmax = std::numeric_limits::max();
const double dmax = std::numeric_limits::max();
// int -> unsigned int; Addieren von 2^b im negativen Fall
// ---------------------------------------------------------
unsigned int i1 = -1; // Warnung, obwohl wohldefiniert
i1 = (unsigned int)(-1); // explizite Konversion, keine Warnung
assert(i1 == umax);
// unsigned int -> int; undefiniert, falls zu gross
// ------------------------------------------------
int i2 = umax; // leider keine Warnung, obwohl undefiniert
// int/unsigned int -> float/double; naechstgroessere/-kleinere Zahl
// falls exaktes Ergebnis zwischen zwei repraesentierbaren Zahlen
// -----------------------------------------------------------------
float i3 = imax; // Warnung, Rundungsfehler
double i4 = imax; // Warnung, obwohl exakt
assert(int(i4) == imax);
std::cout << "i3-i4: " << i3 - i4 << std::endl; // == 1 (aufgerundet)
float i5 = imax + 2u; // Warnung, Rundungsfehler
double i6 = imax + 2u; // Warnung, obwohl exakt
assert((unsigned int)(i6) == imax + 2u);
std::cout << "i5-i6: " << i5 - i6 << std::endl; // == -1 (abgerundet)
// float/double -> int/unsigned int: Runden gegen Null
// ---------------------------------------------------
int i7 = 2.0f; // Warnung, obwohl kein Rundungsfehler
assert (i7 == 2);
int i8 = -2.5; // Warnung, Rundungsfehler
assert (i8 == -2);
// double -> float; naechstgroessere/-kleinere Zahl, falls
// exaktes Ergebnis zwischen zwei repraesentierbaren Zahlen
// (falsch definiert in VL vom 2.11.!)
// ------------------------------------------------------
float i9 = i4; // keine Warnung, obwohl Rundungsfehler
std::cout << "i9-i4: " << i9 - i4 << std::endl; // 1 (aufgerundet)
float i10 = i6; // keine Warnung, obwohl Rundungsfehler
std::cout << "i10-i6: " << i10 - i6 << std::endl; // -1 (abgerundet)
return 0;
}