====== Data Type Ranges ======
:!: Einige Typen sind plattform- und andere compilerabhängig. Deshalb sind folgende Infos nicht als uneingeschränkt gültig zu betrachten! (Der GNU-Compiler kann z.B. einige Typen anders interpretieren als z.B. der MS VS-Compiler.)
===== GNU-Compiler =====
Hier ist eine kleine Zusammenfassung aus den Seiten [[http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#Primitive-Types]] und [[http://www.gnu.org/software/libc/manual/html_node/Range-of-Type.html]]
(Der **C99**-Standard erweitert die Ranges um die 64-Bit Typen.)
^Type Name ^Bytes ^Other Names ^Range of Values ^Kommentar ^
|%%signed char%% |1 |//none// |SCHAR_MIN to SCHAR_MAX (−128 to 127) | |
|%%unsigned char%% |1 |//none// |0 to 255 | |
|%%char%% |1 |//none// |CHAR_MIN to CHAR_MAX. Depending on your system, the char data type is defined as having the same range as either the **signed char** or the **unsigned char** data type. | |
|%%short int%% |2 |short, signed short int, signed short |SHRT_MIN to SHRT_MAX (−32.768 to 32.767) | |
|%%unsigned short int%% |2 |unsigned short |0 to 65.535 | |
|%%int%% |4 |signed int, signed |INT_MIN to INT_MAX (−2.147.483.648 to 2.147.483.647) | |
|%%unsigned int%% |4 |unsigned |0 to 4.294.967.295 | |
|%%long int%% |4,\\ kann 8 Byte sein (auf 64-Bit Systemen) |long, signed long int, signed long |LONG_MIN to LONG_MAX (−2.147.483.648 to 2.147.483.647) | |
|%%unsigned long int%% |4,\\ kann 8 Byte sein (auf 64-Bit Systemen) |unsigned long |0 to 4.294.967.295 | |
|%%long long int%% |8 |long long, signed long long int, signed long long |LLONG_MIN to LLONG_MAX (−9.223.372.036.854.775.808 to 9.223.372.036.854.775.807) |Kein Bestandteil von C89, jedoch von C99 und **GNU C extension**. |
|%%unsigned long long int%%|8 |unsigned long long |0 to 18.446.744.073.709.551.615 |Kein Bestandteil von C89, jedoch von C99 und **GNU C extension**. |
| | | | | |
|%%float%% |FIXME | |FLT_MIN (darf nicht größer als **1e-37** sein) to FLT_MAX (darf nicht kleiner als **1e37** sein) | |
|%%double%% |FIXME | |DBL_MIN to DBL_MAX | |
|%%long double%% |FIXME | |LDBL_MIN to LDBL_MAX | |
===== Visual Studio 2010 =====
Hier ist ein Auszug aus der Seite [[http://msdn.microsoft.com/en-us/library/s3f49ktz(v=vs.100).aspx]]
^Type Name ^Bytes ^Other Names ^Range of Values ^
|%%int%% |4 |signed |–2,147,483,648 to 2,147,483,647 |
|unsigned int |4 |unsigned |0 to 4,294,967,295 |
|%%__int8%% |1 |char |–128 to 127 |
|unsigned %%__int8%% |1 |unsigned char |0 to 255 |
|%%__int16%% |2 |short, short int, signed short int |–32,768 to 32,767 |
|unsigned %%__int16%% |2 |unsigned short, unsigned short int |0 to 65,535 |
|%%__int32%% |4 |signed, signed int, int |–2,147,483,648 to 2,147,483,647 |
|unsigned %%__int32%% |4 |unsigned, unsigned int |0 to 4,294,967,295 |
|%%__int64%% |8 |long long, signed long long |–9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
|unsigned %%__int64%% |8 |unsigned long long |0 to 18,446,744,073,709,551,615 |
|bool |1 |//none// |false or true |
|char |1 |//none// |–128 to 127 by default\\ 0 to 255 when compiled with /J |
|signed char |1 |//none// |–128 to 127 |
|unsigned char |1 |//none// |0 to 255 |
|short |2 |short int, signed short int |–32,768 to 32,767 |
|unsigned short |2 |unsigned short int |0 to 65,535 |
|long |4 |long int, signed long int |–2,147,483,648 to 2,147,483,647 |
|unsigned long |4 |unsigned long int |0 to 4,294,967,295 |
|long long |8 |//none// (but equivalent to %%__int64%%) |–9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
|unsigned long long |8 |//none// (but equivalent to unsigned %%__int64%%) |0 to 18,446,744,073,709,551,615 |
|enum |varies |//none// |See Remarks. |
| | | | |
|float |4 |//none// |3.4E +/- 38 (7 digits) |
|double |8 |//none// |1.7E +/- 308 (15 digits) |
|long double |same as double |//none// |same as double |
|wchar_t |2 |%%__wchar_t%% |0 to 65,535 |
:!: Für alle Fälle gilt: char <= short <= int <= long <= long long
Zur [[http://jk-wiki.kreick.de/doku.php?id=edv:prg:c#externe_links_zum_thema|Kurzbeschreibung der 64-bit Datenmodelle]]
===== Limits ermitteln =====
Mit diesem Beispiel finden wir die Limits für "int" heraus:
#include
#include
using namespace std;
int main()
{
cout << "int: min = " << numeric_limits::min() << endl;
cout << "int: max = " << numeric_limits::max() << endl;
cout << "int: digits = " << numeric_limits::digits << endl;
cout << "int: is_signed = " << numeric_limits::is_signed << endl;
return 0;
}
===== Tatsächliche Byte-Größe ermitteln =====
Mit diesem Beispiel finden wir heraus, wie viele Bytes die Variablen je nach Typ im Speicher belegen:
//
// Das Programm gibt die Byte-Größen von unterschiedlichen Datentypen aus.
//
// ---------- Diese Defines bitte stets auf die passende Werte setzen! ----------
//
#define ARCH "x86_64"
#define BS "W2K8 SP2"
#define COMPILER "MS VS2010"
//
// --------------------
#include
// Bestimmung der Bit-Architektur (32-/64-Bit)
#if (defined SUNx86_32) || (defined SPARC_32) || (defined LINUX_x86) || (defined AIX_PPC_32) || (defined _WIN32 && !defined _WIN64)
#define BIT_ARCH 32
#elif (defined SUNx86_64) || (defined SPARC_64) || (defined LINUX_x86_64) || (defined AIX_PPC_64) || (defined _WIN64)
#define BIT_ARCH 64
#else
#undef BIT_ARCH
#endif
#if !defined BIT_ARCH
#error "BIT_ARCH is not defined"
#endif
#if BIT_ARCH == 32
#define BITMODE "32-Bit"
#elif BIT_ARCH == 64
#define BITMODE "64-Bit"
#else
#define BITMODE "undefined"
#endif
#define PRINT_SIZE_OF_TYPE(x) { int iSizeOfType = sizeof(x); printf("%2d\t(" #x ")\n", iSizeOfType); }
int main (int argc, char *argv[])
{
printf("\nUEbersetzt auf folgendem System:\n\n");
printf("Architektur: %s\n", ARCH);
printf("Betriebssystem: %s\n", BS);
printf("32-/64-Bit: %s\n", BITMODE);
printf("Compiler: %s\n", COMPILER);
printf("\nsizeof\tType\n");
PRINT_SIZE_OF_TYPE(void*);
PRINT_SIZE_OF_TYPE(char);
PRINT_SIZE_OF_TYPE(unsigned char);
PRINT_SIZE_OF_TYPE(short int);
PRINT_SIZE_OF_TYPE(int);
PRINT_SIZE_OF_TYPE(long int);
PRINT_SIZE_OF_TYPE(unsigned long);
PRINT_SIZE_OF_TYPE(long long int);
PRINT_SIZE_OF_TYPE(float);
PRINT_SIZE_OF_TYPE(double);
PRINT_SIZE_OF_TYPE(long double);
PRINT_SIZE_OF_TYPE(wchar_t);
return 0;
}
Wobei die Zeile **PRINT_SIZE_OF_TYPE(void*);** die Pointer-Breite representiert.
Ausgabe:
UEbersetzt auf folgendem System:
Architektur: x86_64
Betriebssystem: W2K8 SP2
32-/64-Bit: 64-Bit
Compiler: MS VS2010
sizeof Type
8 (void*)
1 (char)
1 (unsigned char)
2 (short int)
4 (int)
4 (long int)
4 (unsigned long)
8 (long long int)
4 (float)
8 (double)
8 (long double)
2 (wchar_t)
----
Stand: 24.02.2015\\
--- //[[feedback.jk-wiki@kreick.de|: Jürgen Kreick]]//
EOF