====== 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